현재 20 개의 프로젝트로 구성된 .NET 응용 프로그램을 개발 중입니다. 이러한 프로젝트 중 일부는 .NET 3.5를 사용하여 컴파일되고 일부는 여전히 .NET 2.0 프로젝트입니다 (문제는 없습니다).
문제는 외부 구성 요소를 포함하면 항상 다음과 같은 경고가 표시된다는 것입니다.
"Found conflicts between different versions of the same dependent assembly".
이 경고가 정확히 무엇을 의미하며이 경고를 제외시킬 가능성이 있습니까 (예 : 소스 코드 파일에서 #pragma disable 사용)?
답변
이 경고는 두 프로젝트가 동일한 어셈블리 (예 :)를 System.Windows.Forms
참조하지만 두 프로젝트에는 다른 버전이 필요 하다는 것을 의미합니다 . 몇 가지 옵션이 있습니다.
-
동일한 버전을 사용하도록 모든 프로젝트를 다시 컴파일하십시오 (예 : 모두 .Net 3.5로 이동). 모든 코드가 컴파일 된 종속성 버전으로 실행되므로이 옵션이 선호됩니다.
-
바인딩 리디렉션을 추가하십시오 . 경고가 표시되지 않습니다. 그러나 .Net 2.0 프로젝트는 런타임에 .Net 3.5 버전과 같은 종속 어셈블리의 .Net 3.5 버전에 바인딩됩니다
System.Windows.Forms
. Visual Studio에서 오류를 두 번 클릭하여 바인딩 리디렉션을 빠르게 추가 할 수 있습니다. -
사용하십시오
CopyLocal=true
. 이것이 경고를 억제하는지 확실하지 않습니다. 위의 옵션 2와 마찬가지로 모든 프로젝트는 .Net 3.5 버전의 System.Windows.Forms를 사용합니다.
문제의 참조를 식별하는 몇 가지 방법은 다음과 같습니다.
- https://gist.github.com/1553265에 있는 것과 같은 유틸리티를 사용할 수 있습니다
- 또 다른 간단한 방법은 빌드 출력 상세도 (도구, 옵션, 프로젝트 및 솔루션, 빌드 및 실행, MSBuild 프로젝트 빌드 출력 상세도, 상세)를 설정하고 빌드 한 후 출력 창에서 경고를 검색하고 바로 위의 텍스트를 보는 것입니다. . ( 이 답변에 대한 의견에서 이것을 제안한 pauloya 에게 팁을 주었습니다 ) .
답변
기본적으로 이것은 참조하는 어셈블리가 “로컬 복사”를 “참”으로 설정 한 경우에 발생합니다. 즉, DLL 복사본이 exe와 함께 bin 폴더에 배치됩니다.
Visual Studio는 참조 된 어셈블리의 모든 종속성을 복사하므로 참조되는 동일한 어셈블리의 서로 다른 두 가지 빌드로 끝날 수 있습니다. 프로젝트가 별도의 솔루션으로되어 있으므로 별도로 컴파일 할 수있는 경우 이러한 상황이 발생할 가능성이 높습니다.
내가 얻은 방법은 어셈블리 프로젝트의 참조를 위해 로컬 복사를 False로 설정하는 것입니다. 완제품을 실행하기 위해 어셈블리가 필요한 실행 파일 / 웹 응용 프로그램에 대해서만 수행하십시오.
이해가 되길 바랍니다!
답변
위의 의견에 그들이 제공 한 pauloya의 솔루션을 게시하고 싶었습니다. 나는 그것이 문제의 참조를 찾는 가장 좋은 해결책이라고 생각합니다.
“불쾌한 참조”를 찾는 가장 간단한 방법은 빌드 출력 상세도 (도구, 옵션, 프로젝트 및 솔루션, 빌드 및 실행, MSBuild 프로젝트 빌드 출력 상세도, 상세)를 설정하고 빌드 후 출력 창을 검색하는 것입니다. 경고합니다. 바로 위의 텍스트를 참조하십시오.
예를 들어, 출력 패널에서 “충돌”을 검색하면 다음과 같은 것을 찾을 수 있습니다.
3> There was a conflict between "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089".
3> "EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was chosen because it was primary and "EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" was not.
보다시피, EF 버전 5와 6 사이에 충돌이 있습니다.
답변
내 프로젝트 중 하나와 동일한 문제가 있었지만 위의 어느 것도 경고를 해결하는 데 도움이되지 않았습니다. 자세한 빌드 로그 파일을 확인하고 AsmSpy를 사용하여 영향을받는 솔루션의 각 프로젝트에 올바른 버전을 사용했는지 확인한 후 각 프로젝트 파일의 실제 항목을 두 번 확인했지만 아무런 도움이되지 않았습니다.
결국 문제는 하나의 프로젝트에서 내가 가지고있는 참조 중 하나의 중첩 된 종속성이라는 것이 밝혀졌습니다. 이 참조 (A)에는 다른 솔루션 (B) 버전이 필요했으며 솔루션의 다른 모든 프로젝트에서 직접 참조되었습니다. 참조 된 프로젝트에서 참조를 업데이트하면 해결되었습니다.
Solution A
+--Project A
+--Reference A (version 1.1.0.0)
+--Reference B
+--Project B
+--Reference A (version 1.1.0.0)
+--Reference B
+--Reference C
+--Project C
+--Reference X (this indirectly references Reference A, but with e.g. version 1.1.1.0)
Solution B
+--Project A
+--Reference A (version 1.1.1.0)
위의 내용이 의미하는 바를 알기 위해 몇 시간이 걸렸으므로 다른 사람도 혜택을 볼 수 있기를 바랍니다.
답변
Visual Studio에서 솔루션 및 nuget 패키지 관리 를 마우스 오른쪽 단추로 클릭하면 모든 패키지를 동일한 버전으로 설정 하는 “통합” 탭이 있습니다.
답변
방금이 경고 메시지가 표시되어 솔루션을 정리하고 다시 컴파일 (Build-> Clean Solution)하고 사라졌습니다.
답변
나는 같은 문제가 있었고 web.config에서 다음을 변경하여 해결했습니다.
Newtonsoft.Json 4.0을 사용하여 응용 프로그램을 실행 중이기 때문에 발생했습니다.
에서:
<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>
에:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>
