source

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

nicesource 2023. 5. 24. 22:12
반응형

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

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

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

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

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

는 두 어셈블리를 합니다( 이경는두예동어참의조를미을함합다니리블셈한일가트프젝로고예▁((:▁reference▁this의▁means미다니합▁projects▁the▁warninge▁two을:System.Windows.Forms하지만 두 프로젝트에는 다른 버전이 필요합니다.가 있습니다: " 가 옵 있 다 니 습 이 몇 션 지 다 니 있 ▁you 습 :몇 ▁have

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

  2. 바인딩 리디렉션을 추가합니다.이렇게 하면 경고가 표시되지 않습니다.하지만, 당신의.Net 2.0 프로젝트는 (실행 시) 에 바인딩됩니다.다음과 같은 종속 어셈블리의 Net 3.5 버전System.Windows.FormsVisual Studio에서 오류를 두 번 클릭하여 바인딩 리디렉션을 빠르게 추가할 수 있습니다.

  3. 사용하다CopyLocal=true이것이 경고를 억제할 수 있을지 모르겠습니다.위의 옵션 2와 마찬가지로 모든 프로젝트에서 를 사용합니다.Net 3.5 버전의 시스템.양식.

다음은 문제가 있는 참조를 식별하는 몇 가지 방법입니다.

  • https://gist.github.com/1553265 있는 것과 같은 유틸리티를 사용할 수 있습니다.
  • 또 다른 간단한 방법은 Build 출력 상세도(Tools, Options, Project and Solutions, Build and Run, MSBuild project build 출력 상세도, Detailed)를 설정한 후 출력 창에서 경고를 검색하고 바로 위에 있는 텍스트를 보는 것입니다. (답변에 대한 코멘트에서 이를 제안한 Pauloya에게 보내는 팁)

기본적으로 참조하는 어셈블리에서 "로컬 복사"가 "참"으로 설정되어 있을 때 발생합니다. 즉, DLL의 복사본이 exe와 함께 bin 폴더에 배치됩니다.

Visual Studio는 참조된 어셈블리의 모든 종속성도 복사하기 때문에 참조되는 동일한 어셈블리의 서로 다른 빌드 두 개를 사용할 수 있습니다.프로젝트가 별도의 솔루션에 포함되어 있으므로 별도로 컴파일할 수 있는 경우 이러한 문제가 발생할 가능성이 높습니다.

제가 알아낸 방법은 조립 프로젝트에서 참조를 위해 로컬 복사를 거짓으로 설정하는 것입니다.이 작업은 완제품을 실행하기 위해 어셈블리가 필요한 실행 파일/웹 응용프로그램에 대해서만 수행합니다.

그게 말이 되기를 바랍니다!

위의 댓글에 그들이 제공한 파울로야의 솔루션을 올리고 싶습니다.저는 그것이 문제가 되는 참고 자료를 찾는 최선의 해결책이라고 생각합니다.

"문제가 되는 참조"를 찾는 가장 간단한 방법은 빌드 출력 상세도(도구, 옵션, 프로젝트 및 솔루션, 빌드 및 실행, 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 사이에 충돌이 있습니다.

Visual Studio에서 솔루션 및 Manage nugget 패키지를 마우스 오른쪽 버튼으로 클릭하면 모든 패키지를 동일한 버전으로 설정하는 "Consolidate" 탭이 있습니다.

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

저는 위의 내용이 제가 말하는 것을 보여주기를 바랍니다. 제가 알기까지 몇 시간이 걸렸기 때문에, 다른 누군가도 혜택을 받을 수 있기를 바랍니다.

방금 이 경고 메시지를 받고 솔루션을 정리하고 재컴파일(Build -> Clean Solution)을 했는데 사라졌습니다.

저도 같은 문제가 있었고 web.config에서 다음을 변경하여 해결했습니다.

뉴턴소프트를 사용하여 애플리케이션을 실행하고 있기 때문에 이러한 일이 발생했습니다.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>

Nuget을 사용하여 종속성을 관리하는 경우 다른 방법이 있습니다.때때로 VS와 Nuget이 일치하지 않고 Nuget이 프로젝트가 동기화되지 않은 것을 인식하지 못하는 경우가 있습니다.packages.config는 한 가지만 말하고 References - Properties에 표시된 경로는 다른 것을 나타냅니다.

종속성을 업데이트하려면 다음을 수행합니다.

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

  2. 왼쪽 창에서 '설치된 패키지' 탭 선택 설치된 패키지 기록 많은 경우 먼저 packages.config를 바탕 화면에 복사하여 Google과 교차 확인하여 설치된 Nuget packg를 확인할 수 있습니다.

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

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

  5. 모든 프로젝트에 대해 이 작업을 수행합니다.

  6. 솔루션 수준에서 치료 및 재구성을 수행합니다.

낮은 프로젝트부터 시작하여 높은 수준의 프로젝트로 이동하고 진행하면서 각 프로젝트를 재구성할 수 있습니다.

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

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

이 문제는 "찾아보기"를 사용하여 참조를 찾고 잘못된 버전의 어셈블리를 추가하는 경우 또는 로컬 컴퓨터에 설치한 구성 요소와 코드 저장소에 다른 버전의 구성 요소가 있는 경우에 발생합니다.

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

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

스튜디오에서Tools > Options > Build and Run > MSBuld Project build output verbosity: (set to) Diagnostics.을 찾아보세요.There was a conflict between에 시대에Output 부분입니다.다음은 제가 받은 출력 부분입니다.

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.dll출이다에서 ClosedXML하고 있으며, NuGet 및다따다다릅니라음에는이▁nu▁on▁nu다▁depends▁it니다릅get따라.FastMember.dll 1.3.0.0에, 그위, 또한도 .FastMember프로젝트에 참여하고, 그리고 그것은.FastMember.dll 1.5.0.0일치하지 않습니다!

를 했습니다.ClosedXML&FastMember NuGets의 에.ClosedXML그것이 문제를 해결했습니다!

또한 이 문제가 있었습니다. 제 경우에는 여러 참조의 "특정 버전" 속성이 true로 설정되어 있기 때문입니다.이러한 참조에서 이 값을 false로 변경하면 문제가 해결되었습니다.

=> 일부 응용 프로그램 인스턴스가 부분적으로 설치되는지 확인합니다.

=> 먼저 제거 응용 프로그램에서 해당 인스턴스를 제거합니다.

=> 그런 다음 치료, 재구축 및 배포를 시도합니다.

이것이 제 문제를 해결했습니다.그것이 당신에게도 도움이 되기를 바랍니다.안부 전합니다.

NuGet을 사용하기만 하면 되는 경우:

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 NuGet 패키지 관리를 클릭합니다.

  2. 오른쪽 위에 있는 톱니바퀴를 클릭합니다.

  3. 패키지 소스 위의 NuGet Package Manager에서 일반 탭을 클릭합니다.

  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에서도 모든 것이 다시 작동하기 시작했습니다.

제 프로젝트가 NETs 표준 라이브러리를 참조하고 netcore용으로 참조된 어셈블리 중 하나가 출판되었을 때 저는 그런 문제를 겪었습니다.net standard로 방금 게시했는데 문제가 사라졌습니다.

.NET Core 3.0 스타일의 솔루션은 다음과 같습니다. https://github.com/HTD/ref-check

충돌을 찾으면 충돌을 해결할 수 있습니다.충돌하는 참조가 다른 패키지의 참조인 경우 운이 나쁘거나 원본을 대신 사용해야 합니다.

나의 경우, 충돌하는 패키지는 종종 나 자신의 것이기 때문에 종속성 문제를 해결하고 다시 게시할 수 있습니다.

저도 같은 문제가 있었습니다.프로젝트의 'obj' 폴더에서 폴더 이름을 'Debug_'로 변경했습니다.OLD' 및 재구축됨.새로운 '디버그' 폴더가 자동으로 구축되어 문제가 해결되었습니다.

몇 시간 동안 세부 빌드 로그를 분석한 후 솔루션의 여러 프로젝트가 서로 다른 목표를 가지고 있다는 것을 알게 되었습니다.넷 버전.다 로 바꿨어요.Net 4.7.2를 사용하여 솔루션을 다시 구축하면 오류가 해결됩니다.

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

반응형