[.net] MSB3247 해결-동일한 종속 어셈블리의 다른 버전간에 충돌이 발견되었습니다.

.NET 3.5 솔루션은 msbuild로 컴파일 할 때이 경고로 끝났습니다.

때로는 NDepend가 도움이 될 수 있지만이 경우 자세한 내용은 제공하지 않았습니다. Bob과 마찬가지로 이전 버전의 종속 어셈블리를 참조하는 어셈블리를 찾을 때까지 ILDASM에서 각 어셈블리를 여는 데 의존했습니다.

VS 2010 Beta 2에서 MSBUILD를 사용해 보았습니다 (Connect 기사에서 이것이 CLR의 다음 버전에서 수정되었다고 표시했지만).

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



답변

“MSBuild 프로젝트 빌드 출력 상세”를 “상세”이상으로 변경하십시오. 이렇게하려면 다음 단계를 수행하십시오.

  1. 옵션 대화 상자를 엽니 다 ( 도구-> 옵션 … ).
  2. 왼쪽 트리에서 프로젝트 및 솔루션 노드를 선택한 다음 빌드 및 실행 을 선택 하십시오 .
    • 참고 :이 노드가 표시되지 않으면 모든 설정 표시 대화 상자 하단의 확인란이 선택되어 있는지 확인하십시오 .
  3. 도구 / 옵션 페이지가 나타나면 버전에 따라 MSBuild 프로젝트 빌드 출력 상세 레벨을 적절한 설정으로 설정하십시오.

  4. 프로젝트를 빌드하고 출력 창을보십시오.

MSBuild 메시지를 확인하십시오. ResolveAssemblyReferencesMSB3247 유래, 당신이 특정 문제를 디버깅하는 데 도움이되어야하는 작업입니다 작업.

내 특정 사례는 SqlServerCe에 대한 잘못된 참조였습니다. 아래를 참조하십시오. 두 가지 버전의 SqlServerCe를 참조하는 두 개의 프로젝트가 있습니다. 이전 버전의 프로젝트로 이동하여 참조를 제거한 다음 올바른 참조를 추가했습니다.

Target ResolveAssemblyReferences:
    Consider app.config remapping of assembly "System.Data.SqlServerCe, ..." 
        from Version "3.5.1.0" [H:\...\Debug\System.Data.SqlServerCe.dll] 
        to Version "9.0.242.0" [C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\System.Data.SqlServerCe.dll]
        to solve conflict and get rid of warning.
    C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets : 
        warning MSB3247: Found conflicts between different versions of the same dependent assembly.

참조 된 어셈블리의 버전을 확인하기 위해 각 어셈블리를 열 필요는 없습니다.

  • 각 참조의 속성을 확인할 수 있습니다.
  • 프로젝트 속성을 열고 참조 섹션의 버전을 확인하십시오.
  • 텍스트 편집기로 프로젝트를 엽니 다.
  • .Net 리플렉터를 사용하십시오.

답변

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


답변

때로는 @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


답변

나는 적어도 Visual Studio 2010에서 문제를 발견 할 수 있도록 출력 세부 정보를 최소 상세로 설정해야한다는 것을 알았습니다.

내 문제는 이전에 GAC 참조였던 참조 일 수도 있지만 내 컴퓨터를 다시 설치 한 후에는 더 이상 문제가되지 않았습니다.


답변

나는 같은 오류가 있었고 다른 대답으로 알아낼 수 없었습니다. NuGet 패키지를 “통합”할 수 있다는 것을 알았습니다.

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

답변

기본 ASP.NET MVC 4 베타에 대해 생성 된이 경고는
여기를 참조하십시오.

프로젝트의 .csproj 파일을 수동으로 편집하여이 경고를 제거 할 수 있습니다.

modify …….. : 참조 Include = “System.Net.Http”

읽을 내용 : 참조 Include = “System.Net.Http, Version = 4.0.0.0”


답변

의존성 리더 사용

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에서 제공됨을 보여줍니다.

그런 다음 사이에서 선택할 수 있습니다

  • 라이브러리 소유자에게 동일한 버전을 사용하도록 설득
  • 그들 중 하나를 사용 중지
  • 최신 버전을 사용하도록 구성 파일에 바인딩 리디렉션 추가

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

유닉스 타입 쉘이 없다면 awkand 를 실행하기 전에 하나를 다운로드해야한다 grep. 다음 중 하나를 시도하십시오