새 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 어셈블리에 대한 모든 참조 검색
- 두 개, 하나에서 v6 및 하나에서 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>
어셈블리 리디렉션 오류에 대한 최종 솔루션
좋습니다.이 방법이 (정상적인) 어셈블리 참조 불일치를 해결 하는 데 도움이되기를 바랍니다 .
- 오류를 확인하십시오.
- 어셈블리 리디렉션 후 web.config를 확인하십시오. 존재하지 않는 경우 새로 만듭니다.
- 어셈블리에 대한 참조를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다.
- 속성 테이블에서 버전 (런타임 버전 아님)을 확인합니다. 알았다.
- newVersion 속성에 붙여 넣습니다.
- 편의를 위해 oldVersion의 마지막 부분을 높고 둥글고 상상의 것으로 변경하십시오.
기쁘게 하다.
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을 삭제했습니다.
These issues can be insanely frustrating to find. What's more, developers often follow the same steps as previous project setups. The prior setups didn't encounter the issue. For whatever reason the project file occasionally is updated incorrectly.
I desperately wish Microsoft would fix these visual studio DLL hell issues from popping up. It happens far too often and causing progress to screech to a halt until it is fixed, often by trial and error.
Remember that with the binding redirection
oldVersion="0.0.0.0-6.0.0.0"
You are saying that the old versions of the dll are between version 0.0.0.0 and version 6.0.0.0.
I had similar issue and just wanted to post an answer for others in my situation.
I have a solution running a ASP.NET Web Application with multiple other C# class lib projects.
My ASP.NET Web Application wasn't using json, but other projects where.
This is how I fixed it:
- I made sure all projects where using latest version (6) using NuGet Update on all projects currently using any version of json - this didn't fix the issue
- I added json to the web application using NuGet - this fixed the issue (let me dive into why):
Step 2 was first of all adding a configuration information for json, that suggest that all projects, use the latest version (6) no matter what version they have. Adding the assembly binding to Web.Config is most likely the fix.
However, step 2 also cleaned up som legacy code. It turned out we have previously used an old version (5) of json in our Web Application and the NuGet folders wasn't deleted when the reference was (I suspect: manually) removed. Adding the latest json (6), removed the old folders (json v5). This might be part of the fix as well.
I updated my package and even reinstalled it - but I was still getting the exact same error as the OP mentioned. I manually edited the referenced dll by doing the following.
I removed the newtonsoft.json.dll from my reference, then manually deleted the .dll from the bin directoy. Then i manually copied the newtonsoft.json.dll from the nuget package folder into the project bin, then added the reference by browsing to the .dll file.
Now my project builds again.
아무도 다음을 언급하지 않았으며 내 이해로는 올바른 해결책입니다.
nuget가 설치되어있는 프로젝트의 csproj를 이동하여 설정 AutoGEneratedBindingRedirects
에 false
.
<AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>
'Development Tip' 카테고리의 다른 글
내 웹 사이트에 넣어야하는 중요한 메타 태그는 무엇입니까? (0) | 2020.10.09 |
---|---|
Angular UI 라우터 단위 테스트 (URL 상태) (0) | 2020.10.09 |
문자열 표현에서 제네릭 유형을 어떻게 얻을 수 있습니까? (0) | 2020.10.09 |
파이썬, __eq__를 기반으로 __ne __ () 연산자를 구현해야합니까? (0) | 2020.10.09 |
문자열 배열에 문자열 추가 (0) | 2020.10.09 |