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


320

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

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

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

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


답변:


410

이 경고는 두 프로젝트가 동일한 어셈블리 (예 :)를 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 에게 팁을 주었습니다 ) .

9
유틸리티없이 옵션을 찾는 한 가지 빠른 방법으로 (옵션 2로 바인딩 리디렉션을 추가하면 관련된 참조가 표시됨) 원하는 경우 다른 방법 중 하나를 사용할 수 있습니다 이를 처리하고 구성 파일에서 바인딩 리디렉션을 삭제하십시오.
Brisbe

222
"불쾌한 참조"를 찾는 가장 간단한 방법은 빌드 출력 상세도 (도구, 옵션, 프로젝트 및 솔루션, 빌드 및 실행, MSBuild 프로젝트 빌드 출력 상세도, 상세)를 설정하고 빌드 후 출력 창을 검색하는 것입니다. 경고합니다. 바로 위의 텍스트를 참조하십시오.
pauloya

7
경고를 두 번 클릭하여 (2 단계) 리디렉션을 바인딩해도 경고가 제거되지 않습니다. app.config가 어셈블리와 함께 추가 된 것으로 보았지만 원인이라고 생각되지만 정리 / 재 구축 후에도 경고가 여전히 있습니다. 또한 3 단계를 시도했지만 운이 없습니다. 어떤 아이디어?
angularsen

9
그들이 당신의 프로젝트에서 언급하지 않으면 어떻게 될까요? 예를 들어 Newtonsoft.Json, Version = 6.0.0.0에 종속 된 프로젝트를 참조하고 Newtonsoft.Json, Version = 4.5.0.0에 종속 된 다른 프로젝트를 참조했습니다.
Edward Ned Harvey

3
@ brian-low, 링크 출력 유틸리티와 함께 ​​답변의 옵션으로 빌드 출력 상세 설정 (@pauloya의 의견에서 제안한대로)을 추가하는 것이 좋습니다. (면책 조항, 실제로 그렇게하기 위해 답변을 편집하려고했지만 검토시 거부되었습니다 :)
Rick Riensche

44

기본적으로 이것은 참조하는 어셈블리가 "로컬 복사"를 "참"으로 설정 한 경우에 발생합니다. 즉, DLL 복사본이 exe와 함께 bin 폴더에 배치됩니다.

Visual Studio는 참조 된 어셈블리의 모든 종속성을 복사하므로 참조되는 동일한 어셈블리의 서로 다른 두 가지 빌드로 끝날 수 있습니다. 프로젝트가 별도의 솔루션으로되어 있으므로 별도로 컴파일 할 수있는 경우 이러한 상황이 발생할 가능성이 높습니다.

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

이해가 되길 바랍니다!


31

위의 의견에 그들이 제공 한 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 사이에 충돌이 있습니다.


3
그러나이 정보를 얻었으므로 오류를 어떻게 제거합니까? 충돌이 무엇인지 알 수 있지만 프로젝트가 충돌하는 버전을 참조하는 위치를 찾을 수 없습니다.
Bassie

안녕 @Bassie, 가장 먼저 할 일은 너겟 패키지 파일을 확인하고 모든 파일을 동일한 버전의 패키지로 업데이트 해야하는지 여부를 결정하는 것입니다. update-package [your package name] -version 6.0.0 -reinstall내 대답 과 비슷한 명령을 실행하여이 작업을 수행 할 수 있습니다. stackoverflow.com/questions/22685530/…
user1477388

@Bassie, 경고가 제안하는 것을 수행하고 app.config 파일에 바인딩 리디렉션을 추가하십시오! (업데이트가 옵션이 아닌 경우, 즉)
BrainSlugs83

@Bassie는 내 답변을보고 불일치 문제를 일으키는 다른 어셈블리 /.dll을 얻는 방법을 보여줍니다.
newprint

22

내 프로젝트 중 하나와 동일한 문제가 있었지만 위의 어느 것도 경고를 해결하는 데 도움이되지 않았습니다. 자세한 빌드 로그 파일을 확인하고 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)

위의 내용이 의미하는 바를 알기 위해 몇 시간이 걸렸으므로 다른 사람도 혜택을 볼 수 있기를 바랍니다.


1
여기에도 같은 문제가 있습니다. 그러나 참조를 최신 버전으로 업데이트 할 기회는 없습니다. App.config를 사용해 보았습니다. 응용 프로그램에서 작동하지만 Visual Studio 2010은 빌드 중에 무시합니다.
Thomas Weller

1
와우, 나는 두 달 동안 이러한 문제를 겪었고 그것을 찾아서 해결할 수 없었습니다. 어떤 이유로 디버깅하는 동안에 만 충돌이 발생하고 경우에 따라 귀찮은 .dll을 bin 폴더의 실제 파일로 수동으로 대체 할 수 있습니다. 디버깅은 정말 고통스러운 일이었습니다. 당신의 대답을 읽을 때 나는 이것이 정확히 나에게 일어나고 있다는 것을 깨달았고 5 분 안에
고쳤습니다

19

Visual Studio에서 솔루션nuget 패키지 관리 를 마우스 오른쪽 단추로 클릭하면 모든 패키지를 동일한 버전으로 설정 하는 "통합" 탭이 있습니다.


팁 고마워. 이번에는 도움이되지 않았지만 거기에 있다는 것을 아는 것이 좋습니다.
BrainSlugs83

8

방금이 경고 메시지가 표시되어 솔루션을 정리하고 다시 컴파일 (Build-> Clean Solution)하고 사라졌습니다.


9
그래도 솔루션을 다시 빌드 할 때까지
Luke

이것은 나를 저장합니다! 어제부터 다른 솔루션을 시도했지만이 문제가 해결되었습니다. 위의 주석을 포함 ^. 감사!
vnpnlz

6

나는 같은 문제가 있었고 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>

이것이 나를위한 해결책이었습니다. 더 높은 버전으로 바인딩 리디렉션이 있었고 더 낮은 버전으로 이동 한 후에 만 ​​작동했습니다.
mrwaim

1
왜? 나를 위해 너무 이상합니다. EF를 사용하지 않지만 항상 최신 버전으로 이동하고 싶다고 생각 했습니까?
Hoàng Long

1
@ HoàngLong 참조하는 버전이 이전 버전이지만 포함하는 버전이 최신 버전이므로 @ HoàngLong.
BrainSlugs83

3

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

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

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

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

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

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

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

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

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

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


2

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

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

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


2

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

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

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

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


1

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


1

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

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

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

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

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

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

쉬워요


1

방금 같은 문제를 디버깅하는 데 보냈습니다. 이 문제는 다른 프로젝트 사이가 아니라 실제로 동일한 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했습니다.


0

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


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

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


0

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


0

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


0

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


0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.