development

경고 : 동일한 종속 어셈블리의 다른 버전간에 충돌이 발견되었습니다.

big-blog 2020. 3. 11. 08:06
반응형

경고 : 동일한 종속 어셈블리의 다른 버전간에 충돌이 발견되었습니다.


현재 20 개의 프로젝트로 구성된 .NET 응용 프로그램을 개발 중입니다. 이러한 프로젝트 중 일부는 .NET 3.5를 사용하여 컴파일되고 일부는 여전히 .NET 2.0 프로젝트입니다 (문제는 없습니다).

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

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

이 경고가 정확히 무엇을 의미하며이 경고를 제외시킬 가능성이 있습니까 (예 : 소스 코드 파일에서 #pragma disable 사용)?


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

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

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

  3. 사용하십시오 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에서 솔루션너겟 패키지 관리 를 마우스 오른쪽 버튼으로 클릭하면 모든 패키지를 동일한 버전으로 설정 하는 "통합" 탭이 있습니다.


방금이 경고 메시지가 표시되어 솔루션을 정리하고 다시 컴파일 (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>

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

"찾아보기"를 사용하여 참조를 찾고 잘못된 버전의 어셈블리를 추가하거나 로컬 시스템에 설치 한 것과 다른 버전의 컴포넌트가 코드 저장소에있는 경우가 종종 발생합니다.

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


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

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

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

  2. 왼쪽 창에서 '설치된 패키지'탭을 선택하십시오. 설치된 패키지를 기록하십시오. 패키지가 많으면 먼저 package.config를 데스크탑에 복사하여 Nuget pkgs가 설치되어 있는지 확인하십시오.

  3. 패키지를 제거하십시오. 괜찮습니다. 바로 다시 추가하겠습니다.

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

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

  6. 솔루션 수준에서 정리 및 재구성을 수행하십시오.

하위 프로젝트부터 시작하여 상위 단계의 프로젝트를 진행하고 각 프로젝트를 다시 빌드 할 수 있습니다.

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


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

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

=> 그런 다음 정리, 재구성 및 배포를 시도하십시오.

이렇게하면 내 문제가 해결되었습니다. 도움이됩니다. 친애하는.


또한이 문제가있었습니다. 제 경우에는 많은 참조에서 "Specific Version"속성을 true로 설정했기 때문에 발생했습니다. 해당 참조에서 이것을 false로 변경하면 문제가 해결되었습니다.


NuGet을 사용하는 경우 다음 작업 만 수행하면됩니다.

  1. 프로젝트를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 클릭하십시오.

  2. 오른쪽 상단의 코 그를 클릭하십시오

  3. 패키지 소스 위의 NuGet 패키지 관리자에서 일반 탭을 클릭하십시오.

  4. 바인딩 리디렉션에서 "바인딩 리디렉션 적용 건너 뛰기"확인

  5. 청소 및 재 구축 및 경고가 사라짐

쉬워요


이것은 나에게도 일어났다. 하나의 dll은 두 번 참조되었습니다 : 한 번 직접 (참조에서) 그리고 한 번 간접적으로 (다른 참조 된 프로젝트에서 참조). 직접 참조를 제거하고 세척 및 재 구축 된 솔루션입니다. 문제가 해결되었습니다.


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

필자의 경우 MySQL 참조에 문제가있었습니다. 어쨌든, 나는 가능한 모든 참고 문헌 목록 아래에 세 가지 버전을 나열 할 수 있습니다. .net 2.0, .net 4.0 및 .net 4.5의 경우. 위의 1 ~ 6 단계를 따르고 나에게 도움이되었습니다.


고려해야 할 또 다른 사항은 해당 bin 폴더를 사용하는 서비스가 실행되고 있지 않은지 확인하는 것입니다. 서비스가 중지되고 솔루션을 다시 빌드하는 경우


.resx 파일을 편집 할 때 Mac Visual Studio에 문제가있는 것 같습니다. 실제로 무슨 일이 있었는지 모르겠지만 Mac에서 일부 .resx 파일을 편집 하자마자이 문제가 발생했습니다. Windows에서 프로젝트를 열고 파일을 열었으며 마치 편집하지 않은 것처럼 보였습니다. 그래서 편집하고 저장했으며 모든 것이 Mac에서도 다시 작동하기 시작했습니다.


프로젝트에 NETStandardLibrary에 대한 참조가 있고 참조 된 어셈블리 중 하나가 netcore 용으로 게시 된 경우 이러한 문제가 발생했습니다. 순 표준으로 방금 게시했으며 문제가 사라졌습니다.


방금 같은 문제를 디버깅하는 데 보냈습니다. 이 문제는 다른 프로젝트 사이가 아니라 실제로 동일한 dll / assembly의 다른 버전에 의존하는 한 프로젝트의 여러 참조 사이에있을 수 있습니다. 필자의 경우 FastMember.dll단일 프로젝트에서 두 개의 서로 다른 NuGet 패키지에서 발생하는 참조 버전 불일치 문제가 발생했습니다. 프로젝트를 받았을 때 NuGet 패키지가 누락되었고 VS가 누락 된 패키지 복원을 거부했기 때문에 컴파일되지 않았습니다. NuGet 메뉴를 통해 모든 NuGet을 최신 버전으로, 즉 경고가 표시 될 때 수동으로 업데이트합니다.

Visual Studio 에서 에서 Tools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics.줄을 찾으십시오 . 아래는 내가 얻은 출력의 일부입니다.There was a conflict betweenOutput

1>  There was a conflict between "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null". (TaskId:19)
1>      "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" was chosen because it was primary and "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" was not. (TaskId:19)
1>      References which depend on "FastMember, Version=1.5.0.0, Culture=neutral, PublicKeyToken=null" [C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll]. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\FastMember.1.5.0\lib\net461\FastMember.dll". (TaskId:19)
1>              FastMember, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)
1>      References which depend on "FastMember, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null" []. (TaskId:19)
1>          C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll (TaskId:19)
1>            Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll". (TaskId:19)
1>              ClosedXML, Version=0.94.2.0, Culture=neutral, processorArchitecture=MSIL (TaskId:19)

그것을주의해라 Project file item includes which caused reference "C:\Users\ksd3jvp\Source\Temp\AITool\Misra\AMSAITool\packages\ClosedXML.0.94.2\lib\net46\ClosedXML.dll"

ClosedXML.dllClosedXMLNuGet 에서 제공되며에 따라 다릅니다 FastMember.dll 1.3.0.0. 또한 FastMember프로젝트에 Nuget 있으며 FastMember.dll 1.5.0.0. 불일치!

바인딩 리디렉션이 있었고 최신 버전 만 설치했기 때문에 ClosedXML& FastMemberNuGets를 제거 ClosedXML했습니다.


솔루션은 .NET Core 3.0 스타일입니다. https://github.com/HTD/ref-check

충돌을 발견하면 충돌을 해결할 수 있습니다. 충돌하는 참조가 다른 패키지에서 나온 경우 운이 좋지 않거나 대신 소스를 사용해야합니다.

필자의 경우 충돌하는 패키지는 종종 내 자신의 것이므로 종속성 문제를 해결하고 다시 게시 할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/17806/warning-found-conflicts-between-different-versions-of-the-same-dependent-assemb

반응형