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



7 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의 맨 아래에 도달하는 훨씬 더 빠른 방법입니다.

.net msbuild clr ndepend

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

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

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

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




언젠가는 @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




의존성 판독기 사용

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 을 실행하기 전에 다운로드해야합니다. 다음 중 하나를 시도해보십시오.




나도이 문제를 겪었고 AMissico의 조언을 사용하여 문제를 발견했다. (세부 사항을 자세한 수준으로 설정해야했지만.

범인을 찾은 후에 문제는 사실 아주 직설적이었습니다.

배경 : 프로젝트를 VS2008에서 VS2010으로 업그레이드했습니다. VS2008에서는 대상 프레임 워크가 3.5 였고 VS2010에 가져 왔을 때 4 (Full)로 전환했습니다. 또한 Crystal 보고서를 비롯한 타사 구성 요소를 업그레이드했습니다.

버전 4.0.0.0을 가리 키지 만 한 쌍이 자동으로 변경되지 않았고 (System 및 System.Web.Services) 대부분의 시스템 참조가 나타 났으며 여전히 2.0.0.0을보고있었습니다. Crystal 보고서는 4.0.0.0을 참조하므로 충돌이 발생한 곳입니다. 간단히 솔루션 탐색기의 첫 번째 시스템 라이브러리에 커서를 놓고 목록을 아래로 내리고 2.0.0.0에 대한 참조를 찾고 새 4.0.0.0 버전을 제거한 다음 다시 추가하는 것이 트릭입니다.

이상한 점은 대부분의 참조가 올바르게 업데이트되었고 크리스탈 보고서가 아닌 경우에는 눈치 채지 못했을 것입니다 ...




here 언급했듯이 사용하지 않는 참조를 제거해야하며 경고가 표시됩니다.




빠른 수정:

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




Mac 용 Visual Studio 커뮤니티 추가 :

AMissico의 대답에 따라 로그 수준을 변경해야하며 ASMSpy 또는 ASMSpyPlus는 크로스 플랫폼 솔루션으로 사용할 수 없으므로 다음은 Mac 용 Visual Studio에 대한 간단한 설명입니다.

https://docs.microsoft.com/en-us/visualstudio/mac/compiling-and-building

Visual Studio 커뮤니티 → 기본 설정 ... → 프로젝트 → 빌드 로그 → 자세한 정보




Related