새 ASP.NET MVC 5 프로젝트에서 NuGet 패키지 참조를 업데이트 한 후 JSON.NET과의 어셈블리 버전 충돌을 어떻게 해결할 수 있습니까?


89

VS 2013 (업데이트 1)에서 새 ASP.NET MVC 5 웹 프로젝트를 만든 다음 모든 NuGet 패키지를 업데이트했습니다. 프로젝트를 빌드 할 때 다음 경고가 표시됩니다.

경고 MSB3243 : "Newtonsoft.Json, 버전 = 6.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed"와 "Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed"간의 충돌을 해결할 방법이 없습니다.

그러나 web.config를 확인하면 바인딩 리디렉션이 제자리에 있음을 알 수 있습니다.

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
  </dependentAssembly>

이것이 바로 경고가 권고하는 것입니다.

이 경고를 어떻게 수정할 수 있습니까?


예, 전체 재 구축을했습니다. 또한 NuGet을 최신 버전으로 업데이트하고 새로운 솔루션을 만들고 똑같은 문제를 재현했습니다.
Jim Lamb

답변:


106

경고를 수정하는 데 사용한 단계는 다음과 같습니다.

  • VS에서 프로젝트 언로드
  • .csproj 파일 편집
  • Newtonsoft.Json 어셈블리에 대한 모든 참조 검색
    • 2 개, 1 개에서 v6 및 1 개에서 v5를 찾았습니다.
    • v5에 대한 참조를 v6으로 대체
  • 프로젝트 다시로드
  • 빌드 및 어셈블리 참조 실패 알림
  • 참조를보고 이제 Newtonsoft.Json에 두 개가 있는지 확인합니다. 해결되지 않는 항목을 제거하십시오.
  • 재 구축-경고 없음

12
v6에 대한 참조와 v5에 대한 참조를 두 개 찾았지만 v5를 삭제 (대체하지 않음)했습니다. 그 후 "어셈블리 참조 실패"나 UI에서 Newtonsoft.Json에 대한 두 개의 참조와 같은 문제가 발생하지 않았습니다. 내가있어 추측 사람이 박제install.ps1
ta.speot.is

솔루션에 감사드립니다. 나도 프로젝트 파일에서 이전 참조를 삭제했으며 문제가 없었습니다.
Charles Prakash Dasari

31
+1-이런 일을해야 할 때 정말 미쳐 버립니다. 그래서 나는 항상 너겟 패키지 관리자에서 업그레이드를 클릭하는 것을 주저합니다.
hylander0 2014 년

1
나는이 문제가 있었고 거기에 있다는 것을 알지 못했던 추가 참조를 제거하여 수정했습니다. 다음은 추가 참조의 근본 원인 인 Microsoft Connect 버그에 대한 링크입니다. connect.microsoft.com/VisualStudio/feedback/details/816725/… .
Martin Costello 2014

1
제 경우에는 버전 6.0에 대해 불평했지만 Newtonsoft.Json 11.0.1과 11.0.2의 두 가지 다른 버전에 대한 언급이있었습니다.
Daniel Lobo

31

이 문제는 Newtonsoft.Json 4.5.6에 대한 참조가있는 Microsoft.AspNet.WebApi가 포함 된 패키지를 업데이트하고 이미 버전 6이 설치되어 있기 때문에 발생했습니다. 버전 6을 사용하는 것은 영리하지 못했습니다.

이를 해결하기 위해 WebApi 업데이트 후 도구> NuGet 패키지 관리자> Pacakge 관리자 콘솔을 열고 다음을 실행했습니다.

 Update-Package Newtonsoft.Json

로그에 따르면 6.0.x 및 4.5.6 버전이 모두 최신 버전으로 업데이트되었으며 모든 것이 정상이었습니다.

나는 이것이 다시 올 것 같은 느낌이 든다.


1
여러 프로젝트를 포함하는 솔루션에 여러 버전의 문제가 있었는데,이 문제가 완전히 수정되고 모두 최신 JSON.net으로 업데이트되었습니다. 좋은!
c0d3p03t 2014

1
이것은 내 문제를 해결 한 가장 쉽고 가장 직접적인 솔루션이었습니다. 감사!
youngrrrr

21

프로젝트 파일에서이 섹션을 삭제하면 문제가 해결됩니다.

<ItemGroup>
<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>


이거 야. 바인딩 리디렉션 ''oldVersion = "0.0.0.0-6.0.0.0" ''과 일치하는 Newtonsoft.Json.6.0.1 / 6.0.3 / 6.0.5가 없다고 가정합니다. 그러나 올바른 작성 방법을 모르겠습니다
fantastory

이것은 또한 내 문제였으며 무엇이 추가되었는지 확실하지 않습니다.
기억 상실증

나를 위해 일했습니다. v6.0과 v12.0 간의 충돌과 관련된 오류입니다. 항목 그룹 참조는 v11.0입니다. 그래서 무슨 일이 일어나고 있는지 확실하지 않지만 항목 그룹을 제거하면 컴파일 오류를 제거하는 한 해결 된 것 같습니다.
Brian.S

13

위의 어느 것도 작동하지 않으면 web.config 또는 app.config에서 이것을 사용해보십시오.

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
            <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>

이는 상위 버전을 사용하는 기존 프로젝트가 있고 동일한 패키지의 이전 버전을 사용하는 종속성을 추가하여 이전 버전을 새 버전으로 리디렉션하는 상황에 가장 적합합니다.
Ismail Hawayel

13

Newtonsoft.Json 11.0.1에서 12.0.2로 업그레이드했습니다. Notepad ++에서 프로젝트 파일을 열면 둘 다 발견했습니다.

<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
      <HintPath>..\packages\Newtonsoft.Json.11.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
    </Reference>
  </ItemGroup>

버전 11.0.1에 대한 힌트 경로로 참조를 래핑하는 ItemGroup을 삭제했습니다.

이러한 문제는 찾기가 엄청나게 답답할 수 있습니다. 또한 개발자는 종종 이전 프로젝트 설정과 동일한 단계를 따릅니다. 이전 설정에서는 문제가 발생하지 않았습니다. 어떤 이유로 든 프로젝트 파일이 때때로 잘못 업데이트됩니다.

Microsoft가 이러한 Visual Studio DLL 지옥 문제를 해결하기를 간절히 바랍니다. 그것은 너무 자주 발생하고 종종 시행 착오를 통해 고쳐질 때까지 진행이 멈춰 섰습니다.


1
이것이 바로 문제였습니다. 감사!
George Fabish

8

어셈블리 리디렉션 오류에 대한 최종 솔루션

좋아,이 방법이 (정상적인) 어셈블리 참조 불일치를 해결 하는 데 도움이되기를 바랍니다 .

  1. 오류를 확인하십시오.

웹 사이트 서핑

  1. 어셈블리 리디렉션 후 web.config를 확인하십시오. 존재하지 않는 경우 새로 만듭니다.

기존 web.config 어셈블리 리디렉션

  1. 어셈블리에 대한 참조를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다.

관련 프로젝트의 참조 목록에있는 어셈블리

  1. 속성 테이블에서 버전 (런타임 버전 아님)을 확인합니다. 알았다.

어셈블리 버전을 보여주는 속성 테이블

  1. newVersion 속성에 붙여 넣습니다.

업데이트 된 newVersion을 사용하여 web.config 어셈블리 리디렉션

  1. 편의를 위해 oldVersion의 마지막 부분을 높고 둥글고 상상의 것으로 변경하십시오.

업데이트 된 oldVersion을 사용하여 web.config 어셈블리 리디렉션

기쁘게 하다.


이 답변은 저에게 큰 시간을 절약했습니다! 사용자 지정 C # 라이브러리를 사용하는 웹 응용 프로그램이 있는데 둘 다 동일한 너겟 패키지를 사용했지만 웹 응용 프로그램에 라이브러리보다 이전 버전이 있고 리디렉션에 라이브러리가 사용중인 버전이 포함되지 않았습니다.
War Gravy

4

바인딩 리디렉션으로

oldVersion = "0.0.0.0-6.0.0.0"

이전 버전의 dll은 버전 0.0.0.0과 버전 6.0.0.0 사이에 있습니다.


1
oldVersion실제로 여기에서 약간의 잘못된 이름입니다. 어셈블리 / exe가 범위의 버전을 참조하여 빌드되었으며 0.0.0.0-6.0.0.0실제로 설치된 (그리고 선호하는) 버전이 아래의 값이라는 것입니다 newVersion(이전 버전은 다음과 같이 표현하는 것이 더 좋습니다. "예상 버전"및 새 버전은 "실제 사용 가능한 버전"으로 더 잘 표현됩니다.)
nothingisnecessary

2

아무도 다음을 언급하지 않았으며 내 이해로는 올바른 해결책입니다.

nuget가 설치되어있는 프로젝트의 csproj를 이동하여 설정 AutoGEneratedBindingRedirectsfalse.

<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>

MSDN의 전체 기사.


1

패키지를 업데이트하고 다시 설치했지만 OP에서 언급 한 것과 똑같은 오류가 계속 발생했습니다. 다음을 수행하여 참조 된 dll을 수동으로 편집했습니다.

참조에서 newtonsoft.json.dll을 제거한 다음 bin directoy에서 .dll을 수동으로 삭제했습니다. 그런 다음 nuget 패키지 폴더의 newtonsoft.json.dll을 프로젝트 저장소에 수동으로 복사 한 다음 .dll 파일을 찾아 참조를 추가했습니다.

이제 내 프로젝트가 다시 빌드됩니다.


0

나는 비슷한 문제가 있었고 내 상황에서 다른 사람들을 위해 답변을 게시하고 싶었습니다.

여러 다른 C # 클래스 lib 프로젝트와 함께 ASP.NET 웹 응용 프로그램을 실행하는 솔루션이 있습니다.

내 ASP.NET 웹 응용 프로그램은 json이 아니라 다른 프로젝트를 사용했습니다.

이것이 내가 수정 한 방법입니다.

  1. 현재 모든 버전의 json을 사용하는 모든 프로젝트에서 NuGet 업데이트를 사용하여 최신 버전 (6)을 사용하는 모든 프로젝트를 확인했습니다. 문제가 해결되지 않았습니다.
  2. NuGet을 사용하여 웹 애플리케이션에 json을 추가했습니다. 이로 인해 문제가 해결되었습니다 (이유에 대해 자세히 살펴 보겠습니다).

2 단계는 먼저 json에 대한 구성 정보를 추가하는 것이 었는데, 이는 모든 프로젝트가 보유한 버전에 관계없이 최신 버전 (6)을 사용하도록 제안합니다. Web.Config에 어셈블리 바인딩을 추가하는 것이 수정일 가능성이 높습니다.

그러나 2 단계는 일부 레거시 코드도 정리했습니다. 이전에 웹 응용 프로그램에서 json의 이전 버전 (5)을 사용했으며 참조가 제거되었을 때 NuGet 폴더가 삭제되지 않은 것으로 나타났습니다. 최신 json (6)을 추가하고 이전 폴더 (json v5)를 제거했습니다. 이것은 수정의 일부일 수도 있습니다.


0

Veverke는 AutoGEneratedBindingRedirects를 false로 설정하여 바인딩 리디렉션 생성을 비활성화 할 수 있다고 언급했습니다. 이 질문이 게시 된 이후 새로운 것인지 확실하지 않지만 도구 / 옵션 / Nuget Packet Manager에 "바인딩 리디렉션 적용 건너 뛰기"옵션이 있으며 전환 할 수 있습니다. 기본적으로 꺼져 있습니다. 즉, 리디렉션이 적용됩니다. 그러나 이렇게하면 필요한 바인딩 리디렉션을 수동으로 관리해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.