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

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>

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

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



답변

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

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


답변

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

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

 Update-Package Newtonsoft.Json

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

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


답변

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

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


답변

위의 어느 것도 작동하지 않으면 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>


답변

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. 오류를 확인하십시오.

웹 사이트 서핑

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

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

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

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

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

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

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

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

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

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

기쁘게 하다.


답변

바인딩 리디렉션으로

oldVersion = “0.0.0.0-6.0.0.0”

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