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

StackOverflow https://stackoverflow.com/questions/1871073

  •  18-09-2019
  •  | 
  •  

문제

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

때로는 NDepend가 도움이 될 수도 있지만 이 경우에는 더 자세한 정보를 제공하지 않았습니다. 밥처럼 종속 어셈블리의 이전 버전을 참조하는 어셈블리를 찾을 때까지 ILDASM에서 각 어셈블리를 열어야 했습니다.

VS 2010 베타 2에서 MSBUILD를 사용해 보았지만(Connect 기사에 이 문제가 다음 버전의 CLR에서 수정되었다고 나와 있음) 자세한 내용도 제공되지 않았습니다(베타 2 이후 수정되었을 수도 있음).

더 나은(더 자동화된) 접근 방식이 있나요?

도움이 되었습니까?

해결책

"MSBuild 프로젝트 빌드 출력 Verbosity"를 "상세한"이상으로 변경하십시오. 이렇게하려면 다음 단계를 따르십시오.

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

  4. 프로젝트를 구축하고 출력 창을 살펴보십시오.

MSBuild 메시지를 확인하십시오. 그만큼 ResolveAssemblyReferences MSB3247이 시작된 작업 인 작업은이 특정 문제를 디버깅하는 데 도움이됩니다.

내 특정 사례는 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... Find the error message

Visual Studio 2013

나는 (적어도 Visual Studio 2010에서) 문제를 발견 할 수 있도록 출력 구동성을 최소한 상세하게 설정해야한다는 것을 알았습니다.

내 문제는 이전에 GAC 참조였던 참조 였지만 더 이상 내 컴퓨터의 재설치 후에는 그렇지 않았습니다.

이 경고는 기본 ASP.NET MVC 4 베타에 대해 생성되었습니다여기를 봐

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

modify ........ : 참조 포함 = "system.net.http"

읽으려면 ...... : 참조 포함 = "system.net.http, version = 4.0.0.0"

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

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

종속성 리더를 사용하십시오

사용 dep.exe 전체 폴더의 모든 중첩 종속성을 나열 할 수 있습니다. Grep 또는 AWK와 같은 Unix 도구와 결합하여 문제를 해결하는 데 도움이 될 수 있습니다.

어셈블리가 하나 이상의 버전으로 참조되는 것을 찾습니다

$ 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에서 실행하는 방법

Unix 유형 쉘이없는 경우 실행하기 전에 하나를 다운로드해야합니다. awk그리고 grep. 다음 중 하나를 시도하십시오

나도이 문제가 있었고 Amissico의 조언도 문제를 발견했습니다.

범인을 찾은 후 문제는 실제로 상당히 똑바로 진행되었습니다.

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

버전 4.0.0.0을 가리키는 대부분의 시스템 참조가 밝혀졌지만 부부는 자동으로 변경되지 않았으며 (System 및 System.Web.Services) 여전히 2.0.0.0을보고있었습니다. Crystal Reports는 4.0.0.0을 참조하고 있으므로 충돌이 발생하는 곳이었습니다. 솔루션 탐색기의 첫 번째 시스템 라이브러리에 커서를 넣고 목록을 아래로 내려 놓고 2.0.0.0에 대한 참조를 찾아 최신 4.0.0.0 버전을 제거하고 다시 adding하는 것이 트릭을 수행했습니다.

이상한 점은 대부분의 참조가 올바르게 업데이트되었고 Crystal 보고서에 대한 것이 아니라면 아마 눈치 채지 못했을 것입니다 ...

나는 신청서를 작성했다 Mike Hadlow 응용 프로그램 : Asmspy.

내 앱은 GUI가있는 WPF 앱이며 내 홈 웹 서버에서 다운로드 할 수 있습니다. asmspyplus.exe.

코드는 다음에서 사용할 수 있습니다. github

Gui Sample

말한 바와 같이 여기, 사용하지 않은 참조를 제거해야하며 경고가 진행됩니다.

ASP.NET 빌드 관리자는 폴더를 알파벳순으로 통과하여 웹 사이트를 구축하고 있으며 각 폴더에 대해 종속성을 파악하고 먼저 종속성을 구축 한 다음 선택한 폴더를 작성합니다.

이 경우 ~/컨트롤 인 문제 폴더는 처음에 구축되도록 선택되었지만 아직 알려지지 않은 이유에서 일부 컨트롤을 다른 컨트롤과 동일한 어셈블리 내부 대신 별도의 어셈블리로 구축합니다 ( 일부 컨트롤은 동일한 폴더의 다른 컨트롤에 의존한다는 사실에 연결됩니다).

그런 다음 구축 된 다음 폴더 (~/file-center/control)는 ~/컨트롤에 의존하는 루트 폴더 ~/에 의존하므로 폴더 ~/컨트롤이 다시 구축되고 있습니다. 자체 어셈블리는 이제 분리 된 어셈블리가 여전히 참조되고있는 다른 컨트롤과 동일한 어셈블리에 결합됩니다.

따라서이 시점에서 2 어셈블리 (적어도)는 동일한 컨트롤을 가지며 빌드가 실패합니다.

우리는 여전히 왜 이런 일이 일어 났는지 알지 못하지만 컨트롤 폴더 이름을 zcontrols로 변경하여이를 해결할 수있었습니다. 그대로.

빠른 수정:

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

때때로 AutoGenerateBindingRedirects 충분하지 않습니다 (심지어도 GenerateBindingRedirectsOutputType). 모든 것을 검색합니다 There was a conflict 항목과 수동으로 하나씩 고정하는 것은 지루할 수 있으므로 로그 출력을 구문 분석하고 당신을 위해 생성하는 작은 코드를 썼습니다 (덤프 stdout):

// Paste all "there was a conflict" lines from the msbuild diagnostics log to the file below
const string conflictFile = @"C:\AssemblyConflicts.txt";

var sb = new StringBuilder();
var conflictLines = await File.ReadAllLinesAsync(conflictFile);
foreach (var line in conflictLines.Where(l => !String.IsNullOrWhiteSpace(l)))
{
    Console.WriteLine("Processing line: {0}", line);

    var lineComponents = line.Split('"');
    if (lineComponents.Length < 2) 
        throw new FormatException("Unexpected conflict line component count");

    var assemblySegment = lineComponents[1];
    Console.WriteLine("Processing assembly segment: {0}", assemblySegment);
    var assemblyComponents = assemblySegment
                              .Split(",")
                              .Select(kv => kv.Trim())
                              .Select(kv => kv.Split("=")
                              .Last())
                              .ToArray();

    if (assemblyComponents.Length != 4) 
        throw new FormatException("Unexpected conflict segment component count");

    var assembly = assemblyComponents[0];
    var version = assemblyComponents[1];
    var culture = assemblyComponents[2];
    var publicKeyToken = assemblyComponents[3];

    Console.WriteLine("Generating assebmly redirect for Assembly={0}, Version={1}, Culture={2}, PublicKeyToken={3}", assembly, version, culture, publicKeyToken);
    sb.AppendLine($"<dependentAssembly><assemblyIdentity name=\"{assembly}\" publicKeyToken=\"{publicKeyToken}\" culture=\"{culture}\" /><bindingRedirect oldVersion=\"0.0.0.0-{version}\" newVersion=\"{version}\" /></dependentAssembly>");
}

Console.WriteLine("Generated assembly redirects:");
Console.WriteLine(sb);

팁 : 사용 MSBuild 바이너리 및 구조화 된 로그 뷰어 그리고 경고를 방출하는 프로젝트의 충돌에 대한 바인딩 리디렉션 만 생성합니다 (즉, 그 과거에만 there was a conflict 위의 코드에 대한 입력 텍스트 파일로의 줄 [AssemblyConflicts.txt]).

(내부) 종속성을 고려하지 않고 가장 간단한 방법은 다음과 같습니다.

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

제 경우에는 MySQL 참조에 문제가 있었습니다.어쨌든 나는 사용 가능한 모든 참고 문헌 목록 아래에 세 가지 버전을 나열할 수 있었습니다.위의 1~6번 과정을 따랐는데 제게는 효과가 있었습니다.

Mac 커뮤니티 추가를위한 비주얼 스튜디오 :

처럼 Amissico의 대답 로그 레벨을 변경해야하며 ASMSPY 및 ASMSPYPLUS는 크로스 플랫폼 솔루션으로 제공되지 않습니다. 여기 Mac 용 Visual Studio의 짧은 추가 기능이 있습니다.

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

들어 왔어요 비주얼 스튜디오 커뮤니티 → 선호도 ... → 프로젝트 → 로그 빌드 → 구두 성

Resharper가있는 경우 솔루션에서 사용하지 않은 참조를 모두 제거하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top