[.net] MSB3247 해결 - 동일한 종속 어셈블리의 서로 다른 버전간에 충돌이 있음


Answers

Mike Hadlow는 AsmSpy라는 작은 콘솔 앱을 게시하여 각 어셈블리의 참조를 멋지게 나열합니다.

Reference: System.Net.Http.Formatting
        4.0.0.0 by Shared.MessageStack
        4.0.0.0 by System.Web.Http

Reference: System.Net.Http
        2.0.0.0 by Shared.MessageStack
        2.0.0.0 by System.Net.Http.Formatting
        4.0.0.0 by System.Net.Http.WebRequest
        2.0.0.0 by System.Web.Http.Common
        2.0.0.0 by System.Web.Http
        2.0.0.0 by System.Web.Http.WebHost

이것은 MSBuild 출력에 의존하는 것보다 경고 MSB3247의 맨 아래에 도달하는 훨씬 빠른 방법입니다.

Question

.NET 3.5 솔루션은 msbuild로 컴파일 할 때이 경고와 함께 종료되었습니다.

때로는 NDepend가 도움이 될 수도 있지만이 경우에는 더 이상의 세부 사항을 제공하지 않았습니다. Bob과 마찬가지로 ILDASM에서 각 어셈블리를 열려면 의존 어셈블리의 이전 버전을 참조하는 어셈블리를 찾을 때까지해야했습니다.

나는 VS 2010 베타 2에서 MSBUILD를 사용해 보았습니다 (연결 기사에서 CLR의 다음 버전에서 수정되었음을 표시 했음)하지만 더 자세한 정보를 제공하지 않았습니다 (고정 포스트 베타 2)

더 나은 (보다 자동화 된) 접근법이 있습니까?




나는 같은 오류가 있었고 다른 대답으로는 알 수 없었다. NuGet 패키지를 "통합"할 수 있음을 발견했습니다.

  1. 솔루션에서 마우스 오른쪽 버튼을 클릭하십시오.
  2. 너겟 패키지 관리를 클릭하십시오.
  3. 탭 및 업데이트를 동일한 버전으로 통합하십시오.






의존성 판독기 사용

dep.exe 를 사용하면 전체 폴더의 모든 중첩 된 종속성을 나열 할 수 있습니다. grep이나 awk와 같은 유닉스 도구와 결합하면 문제를 해결하는 데 도움이됩니다.

두 개 이상의 버전에서 참조되는 어셈블리 찾기

$ dep | awk '{ print $1 " " $2; print $4 " " $5 }' | awk '{ if (length(versions[$1]) == 0) versions[$1] = $2; if (versions[$1] != $2) errors[$1] = $1; }  END{ for(e in errors) print e } ' 
System.Web.Http            

이 모호한 명령 줄은 dep.exe를 실행 한 다음 출력을 awk로 두 번 파이프합니다.

  • 부모와 자식을 하나의 열에 넣으십시오 (기본적으로 각 행에는이 부모가 그 자식에 의존한다는 사실을 표현하기 위해 하나의 부모와 자식이 포함되어 있습니다)
  • 연관 배열을 사용하여 일종의 '그룹화'를 수행합니다.

이 어셈블리가 귀하의 저장소에서 어떻게 가져 왔는지 이해하기.

$ dep myproject/bin | grep -i System\.Web\.Http
MyProject-1.0.0.0 >> System.Web.Http.Web-5.2.3.0 2 ( FooLib-1.0.0.0 )
MyProject-1.0.0.0 >> System.Web.Http.Web-4.0.0.0 2 ( BarLib-1.0.0.0 )
FooLib-1.0.0.0 > System.Web.Http.Web-5.2.3.0 1
BarLib-1.0.0.0 > System.Web.Http.Web-4.0.0.0 1 

이 예제에서 도구는 System.Web.Http 5.2.3이 FooLib에 대한 종속성에서 비롯된 반면 버전 4.0.0은 BarLib에서 가져온 것임을 보여줍니다.

그럼 당신은

  • libs의 소유자에게 같은 버전을 사용하도록 설득
  • 하나만 사용 중지
  • 구성 파일에 바인딩 리디렉션을 추가하여 최신 버전 사용

Windows에서이 작업을 실행하는 방법

유닉스 쉘이 없다면 awkgrep 을 실행하기 전에 다운로드해야합니다. 다음 중 하나를 시도해보십시오.




빠른 수정:

솔루션에서 마우스 오른쪽 버튼을 클릭 -> 솔루션에 대한 NuGet 패키지 관리 -> 통합 에서 동일한 패키지의 다른 버전이 설치되어 있는지 확인할 수 있습니다. 다른 버전을 제거하고 최신 버전을 설치하십시오.




언젠가는 @AMissico 대답으로는 충분하지 않습니다. 내 경우에는 출력 창에서 오류를 찾을 수 없으므로 다음 단계를 수행하여 로그 파일을 작성하고 분석하기로 결정했습니다.

  1. 빌드 로그를 파일에 저장하는 중 ... https://msdn.microsoft.com/en-us/library/ms171470.aspx

    msbuild MyProject.proj /fl /flp:logfile=MyProjectOutput.log;verbosity=detailed

  2. warning MS... 또는 특정 경고 정보 찾기 : (예 : 9293 번 줄) Found conflicts between different versions... . 충돌 오류의 전체 내용이이 메시지 위에 표시됩니다 (예 : 9277 줄) There was a conflicts between...

Visual Studio 2013




Links