.net - 경고 : 동일한 종속 어셈블리의 서로 다른 버전간에 충돌이 있음


저는 현재 20 개의 프로젝트로 구성된 .NET 어플리케이션을 개발 중입니다. 이러한 프로젝트 중 일부는 .NET 3.5를 사용하여 컴파일되고 일부는 여전히 .NET 2.0 프로젝트입니다 (지금까지 아무런 문제가 없음).

문제는 외부 구성 요소를 포함 할 경우 항상 다음과 같은 경고가 표시된다는 것입니다.

"Found conflicts between different versions of the same dependent assembly".

이 경고는 정확히 무엇을 의미하며 (소스 코드 파일에서 #pragma disable을 사용하는 것과 같은)이 경고를 제외 할 가능성이 있습니까?



Answers



이 경고는 두 프로젝트가 동일한 어셈블리 (예 : System.Windows.Forms )를 참조하지만 두 프로젝트가 다른 버전을 필요로 함을 의미합니다. 몇 가지 옵션이 있습니다.

  1. 모든 프로젝트를 동일한 버전을 사용하도록 다시 컴파일하십시오 (예 : .Net 3.5로 모두 이동). 이는 모든 코드가 컴파일 된 종속성 버전으로 실행되기 때문에 선호되는 옵션입니다.

  2. 바인딩 리디렉션을 추가하십시오. 이렇게하면 경고가 표시되지 않습니다. 그러나 .NET 2.0 프로젝트는 (런타임에) System.Windows.Forms 와 같은 종속 어셈블리의 .Net 3.5 버전에 바인딩됩니다. Visual Studio에서 오류를 두 번 클릭하여 바인딩 리디렉션을 빠르게 추가 할 수 있습니다.

  3. CopyLocal=true 사용하십시오. 이 경고가 표시되지 않을지 확실하지 않습니다. 위의 옵션 2와 마찬가지로 모든 프로젝트에서 .Net 3.5 버전의 System.Windows.Forms를 사용하게됩니다.

다음은 문제가되는 참조를 식별하는 유틸리티입니다.

https://gist.github.com/1553265




기본적으로 이것은 참조하는 어셈블리에 "로컬 복사"가 "True"로 설정되어있을 때 발생합니다. 즉, DLL 사본이 EXE와 함께 bin 폴더에 저장됩니다.

Visual Studio는 참조 된 어셈블리의 모든 종속성도 복사하므로 참조되는 동일한 어셈블리의 두 가지 빌드로 끝날 수 있습니다. 이것은 프로젝트가 별도의 솔루션에 있고 따라서 개별적으로 컴파일 될 수있는 경우에 발생할 가능성이 큽니다.

그 방법은 어셈블리 프로젝트의 참조에 대해 로컬 복사를 False로 설정하는 것입니다. 완제품을 실행하기 위해 어셈블리가 필요한 실행 파일 / 웹 응용 프로그램에 대해서만 수행하십시오.

희망은 그것이 의미가 있습니다!




나는 위의 코멘트에서 그들이 제공 한 솔루션을 게시하고 싶었다. 나는 그것이 기분을 상실한 참조를 찾는 가장 좋은 해결책이라고 생각한다.

"잘못된 참조"를 찾는 가장 간단한 방법은 빌드 출력 상세 설정 (도구, 옵션, 프로젝트 및 솔루션, 빌드 및 실행, 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)

위의 내용이 의미하는 바를 알기를 바라며, 알아 내는데 2 시간 정도 걸렸으므로 다른 누군가에게도 도움이되기를 바랍니다.




난 그냥이 경고 메시지를 가지고 솔루션을 청소하고 다시 컴파일 (빌드 -> 깨끗한 솔루션) 그리고 멀리 갔다.




나는 동일한 문제가 있었고 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>



Visual Studio에서 솔루션Manage nuget 패키지 를 오른쪽 클릭하면 모든 패키지를 같은 버전으로 설정하는 "Consolidate" 탭이 나타납니다.




이것은 실제로 외부 구성 요소에 따라 다릅니다. .NET 응용 프로그램에서 외부 구성 요소를 참조하면 해당 구성 요소를 식별하는 GUID가 생성됩니다. 이 오류는 프로젝트 중 하나에서 참조하는 외부 구성 요소가 다른 어셈블리의 다른 구성 요소와 이름이 같지만 버전이 다른 경우에 발생합니다.

이는 "찾아보기"를 사용하여 참조를 찾고 잘못된 버전의 어셈블리를 추가하거나 로컬 시스템에 설치 한 것과 다른 버전의 구성 요소를 코드 리포지토리에 가지고있을 때 가끔 발생합니다.

이러한 충돌이있는 프로젝트를 찾아서 참조 목록에서 구성 요소를 제거한 다음 다시 추가하여 동일한 파일을 가리키고 있는지 확인하십시오.




Nuget을 사용하여 종속성을 관리하는 경우이 작업을 수행 할 수있는 또 다른 방법이 있습니다. 나는 때때로 VS와 Nuget이 일치하지 않으며 Nuget이 프로젝트가 동기화되지 않았 음을 인식하지 못한다는 것을 발견했습니다. packages.config는 한 가지 말을하지만 References - Properties에 표시된 경로는 다른 것을 나타냅니다.

의존성을 기꺼이 업데이트하려면 다음을 수행하십시오.

  1. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 'Manage Nuget Packages'를 클릭하십시오.

  2. 왼쪽 패널에서 '설치된 패키지'탭을 선택하십시오. 설치된 패키지를 기록하십시오. 패키지가 많은 경우 먼저 packages.config를 데스크탑에 복사하면 Google과 교차 점검하여 어떤 Nuget 패키지가 설치되어 있는지 확인할 수 있습니다

  3. 패키지를 제거하십시오. 그것의 좋아, 우리는 그 (것)들을 즉시 후에 추가 할 것이다.

  4. 필요한 패키지를 즉시 설치하십시오. Nuget이 할 일은 최신 버전을 얻는 것뿐만 아니라 참조를 변경하고 바인딩 리디렉션을 추가하는 것입니다.

  5. 모든 프로젝트에서이 작업을 수행하십시오.

  6. 솔루션 수준에서 Clean and Rebuild를 수행하십시오.

더 낮은 프로젝트부터 시작하여 더 높은 레벨 프로젝트로 나아가고, 진행하면서 각 프로젝트를 재구성 할 수 있습니다.

종속성을 업데이트하지 않으려면 패키지 관리자 콘솔을 사용하고 Update-Package -ProjectName [yourProjectName] [packageName] -Version [versionNumber] 구문을 사용합니다.




또한이 문제는 - 내 경우에는 여러 참조에 "특정 버전"속성을 true로 설정하여 발생했습니다. 이러한 참조에서이 값을 false로 변경하면 문제가 해결됩니다.




=> 응용 프로그램의 일부 인스턴스가 부분적으로 설치되어 있는지 확인하십시오.

=> 먼저 제거 응용 프로그램에서 해당 인스턴스를 제거하십시오.

=> 정리하고, 다시 빌드하고, 배포를 시도하십시오.

이게 내 이슈를 해결했습니다. 당신을 도울 수 있습니다. 친애하는.




이것은 나에게도 일어났다. 하나의 dll은 두 번 참조되었습니다. 한 번은 직접 참조 (한 번 참조)하고 한 번 간접적으로 (다른 참조 된 프로젝트가 참조한) 참조되었습니다. 내가 직접 참조, 청소 및 재건 솔루션을 제거했습니다. 문제가 해결되었습니다.




  1. "솔루션 탐색기"를 엽니 다.
  2. "모든 파일 표시"를 클릭하십시오.
  3. "참조"확장
  4. 나머지 아이콘과 약간 다른 아이콘이있는 하나 이상의 참조가 표시됩니다. 일반적으로 노란 상자로 메모 해 두는 것이 좋습니다. 그냥 제거하십시오.
  5. 참조를 다시 추가하고 코드를 컴파일하십시오.
  6. 그게 다야.

필자의 경우 MySQL 레퍼런스에 문제가있다. 어쨌든, 나는 사용 가능한 모든 참조 목록 아래에 세 가지 버전을 나열 할 수 있습니다. .net 2.0, .net 4.0 및 .net 4.5. 나는 위의 과정 1에서 6까지를 따라 갔고 그것은 나를 위해 일했다.




고려해야 할 또 다른 사항은 해당 bin 폴더를 사용하는 서비스가 실행되고 있지 않은지 확인하십시오. 그들이 서비스를 중지하고 솔루션을 다시 작성하는 경우