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


371

여러 프로젝트가있는 솔루션을 정리 한 다음 빌드하면 출력 창에 빌드 성공을보고합니다. 그러나 오류 목록 창을 볼 때 다음 경고가 표시됩니다.

해결할 수없는 동일한 종속 어셈블리의 다른 버전간에 충돌이 발견되었습니다. 이러한 상세 충돌은 로그 상세가 상세로 설정된 경우 빌드 로그에 나열됩니다. C : \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets

이 메시지를 두 번 클릭하면 C : \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets 파일이 열리지 만 내용이 이해되지 않습니다.

웹에 Visual Studio Express 2013을 사용하고 있습니다.

무엇이 잘못되었고 어떤 DLL에 문제가 있는지 어떻게 알 수 있습니까? 그러면 어떻게 경고가 사라 집니까?



답변:


513

eta : SO 자체의 @Nick Craver 가 작성해야 할 킬러 기사 가 있습니다.


다른 답변이 이것을 말하지만, 그들은 그것을 명시 적으로 만들지 않으므로, 나는 ....

VS2013.2에서 인용 된 정보의 방출을 실제로 트리거하려면 메시지를 읽을 필요가 없습니다.

C : \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5) : 경고 MSB3277 : 확인할 수없는 동일한 종속 어셈블리의 서로 다른 버전간에 충돌이 발견되었습니다. 이러한 상세 충돌은 로그 세부 정보 detail 으로 설정된 경우 빌드 로그에 나열됩니다 .

이것은 올바르지 않습니다 (적어도 일부 버전의 Visual Studio에서는 그렇습니다-최신 VS2015 업데이트 3 이상에서는 정상인 것 같습니다). 대신에 돌려 진단 (에서 도구 -> 옵션 -> 프로젝트 및 솔루션 -> 빌드 및 실행 , 설정 의 MSBuild 프로젝트 빌드 출력 자세한 표시 하면 다음과 같은 메시지를 볼 수 있습니다 그러자,) :

"Newtonsoft.Json, Version = 6.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed"와 "Newtonsoft.Json, Version = 6.0.5.17707, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed"사이에 충돌이있었습니다.

  • "Newtonsoft.Json, 버전 = 6.0.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed"는 기본이므로 "Newtonsoft.Json, Version = 6.0.5.17707, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed"가 선택되지 않았기 때문에 선택되었습니다.

그때

  • Ctrl-Alt-O 빌드 출력 창으로 이동
  • 드릴 다운을 찾으려면 " 선택됨 "을 검색 하십시오.

... 예, [진단] 메시지의 세부 사항을보고있는 사람들에게는 모든 무시할 내용이 6.x내부적으로 Assembly Version이라는 6.0.0.0즉, SemVer Major 구성 요소 만 Assembly에 들어가는 관례있다는 무시의 소지가 있었습니다. 버전 :)


3
고마워-Visual Studio를 오랫동안 사용해 왔으며 빌드 로그 에서이 부분을 파헤쳐 야하는 문제가 없었습니다. 다른 문제이지만 내가보고있는 정보가 어딘가에서 방출되고 있음을 깨닫고 내 문제를 해결했습니다.
Timothy Lee Russell

4
자세한 로그 수준은 VS 내부에서 작동하는 것 같습니다 (진단이 필요하지 않음). MSBuild가 VS 내부에서 다르게 동작하지만 처음이 아닐 것입니다 ..
Johannes Rudolph

105
메뉴 Tools-> Options에서 log verbosity를 변경하려면 Project and Solutions-> Build and Run
Jenn

3
제 경우에는 세 가지 갈등이 있었고 그 중 하나는 다른 두 가지를 담당했습니다. "자세한"빌드 로그를 메모장에 복사하고 "충돌"을 검색하고 인식 한 참조에 대해 NuGet 패키지를 업데이트하면 문제가 해결되었습니다.
Isaac Lyman

@robotnik 편집 제안 [타인이 거부 한]에 감사드립니다. 실제로 답변 의 맨 아래 에 정보를 포함 시켰지만 현재의 답변은 의도 한대로 명확합니다.
Ruben Bartelink

76

msbuild Foo.sln /t:Rebuild /v:diag(에서 C:\Program Files (x86)\MSBuild\12.0\bin)을 실행 하여 명령 행에서 솔루션을 빌드하고 약간 더 자세한 정보를 얻은 다음 .csproj., 경고를 기록하는 로그 를 찾아 버전이 다른 동일한 공통 어셈블리를 사용하는 다른 프로젝트의 참조 및 참조를 확인하십시오.

편집 : VS2013에서 직접 빌드 세부 정보를 설정할 수도 있습니다. 이동 Tools> Options메뉴로 이동 한 다음 Projects and Solutions과로 설정은 MSBuild의 상세 Diagnostic.

편집 : 방금 하나를 얻었을 때 설명이 거의 없습니다. 필자의 경우 경고는 참조 추가 대화 상자와 달리 Resharper 프롬프트를 사용하여 참조를 추가했기 때문에 발생했으며 v4와 v12를 모두 선택할 수 있지만 버전이 없습니다.

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework" />

vs

<Reference Include="Microsoft.Build, Version=12.0.0.0, ..." />
<Reference Include="Microsoft.Build.Framework, Version=12.0.0.0, ..." />

/v:diag자세한 정보 가 포함 된 MSBuild 로그 에서는 다음과 같습니다. 두 참조가 충돌 한 세부 정보를 제공합니다.

  There was a conflict between 
  "Microsoft.Build.Framework, Version=4.0.0.0, ..." and 
  "Microsoft.Build.Framework, Version=12.0.0.0, ...". (TaskId:16)

      "Microsoft.Build.Framework, Version=4.0.0.0, ..." was chosen because it was primary and 
      "Microsoft.Build.Framework, Version=12.0.0.0, ..." was not. (TaskId:16)

      References which depend on "Microsoft.Build.Framework, Version=4.0.0.0, ..." 
      [C:\...\v4.5.1\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v4.5.1\Microsoft.Build.Framework.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v4.5.1\Microsoft.Build.Framework.dll". (TaskId:16)
              Microsoft.Build.Framework (TaskId:16)

      References which depend on "Microsoft.Build.Framework, Version=12.0.0.0, ..." 
      [C:\...\v12.0\Microsoft.Build.Framework.dll]. (TaskId:16)

          C:\...\v12.0\Microsoft.Build.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v12.0\Microsoft.Build.dll". (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

          C:\...\v12.0\Microsoft.Build.Engine.dll (TaskId:16)
            Project file item includes which caused reference "C:\...\v12.0\Microsoft.Build.Engine.dll". (TaskId:16)
              Microsoft.Build, Version=12.0.0.0, ... (TaskId:16)

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3277: 
Found conflicts between different versions of the same dependent assembly that could not be resolved.  
These reference conflicts are listed in the build log when log verbosity is set to detailed. 
[C:\Users\Ilya.Kozhevnikov\Dropbox\BuildTree\BuildTree\BuildTree.csproj]

10
나는 그 명령을 로그 파일에 파이핑하여 더 쉽게 볼 수있었습니다.msbuild "Foo.sln" /t:Rebuild /v:d > build.log
CrazyPyro

2
이를 위해 터미널에 접속하는 가장 좋은 방법 : stackoverflow.com/a/22702405/268066
CrazyPyro

@CrazyPyro msbuild에는 "내장"파이프가 있습니다- 여기에 로거 설명을위한 스위치를/l:FileLogger,Microsoft.Build.Engine;logfile=build.log 주목 하십시오
drzaus

3
"빌드 로그"는 어디에 있습니까? 어떻게 찾습니까?
죄수 제로

이 답변은 단일 사용자가 관심을 갖는 msbuild에서 자세한 정보를 얻는 방법을 보여줍니다. 다른 모든 답변은 VS를 사용하고 Windows 환경에서 실행 중이라고 가정합니다.
무조건

39

표시된 두 메시지를 비교하여 추가 Ruben의 답변 만 지원할 수 있습니다.

여기에 이미지 설명을 입력하십시오

그리고 메시지 :

C : \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5) : 경고 MSB3277 : 확인할 수없는 동일한 종속 어셈블리의 서로 다른 버전간에 충돌이 발견되었습니다. 이러한 상세 충돌은 로그 세부 정보가 detail으로 설정된 경우 빌드 로그에 나열됩니다 .

루벤의 말이 맞습니다. 이것은 사실이 아닙니다. 충돌이 없으며 조립품이 누락되었습니다. 뷰가 필요할 때 즉, 처음 표시되기 직전 컴파일되기 때문에 프로젝트가 ASP.NET 응용 프로그램 인 경우 특히 지루합니다 . 이때 조립품을 준비해야합니다. (코드의 나머지 부분과 함께 뷰를 미리 컴파일하는 옵션이 있지만 이것은 또 다른 이야기 입니다.) 반면에 상세를 진단으로 설정 하면 다음과 같은 결과가 나타납니다.

C : \ Program Files (x86) \ MSBuild \ 12.0 \ bin \ Microsoft.Common.CurrentVersion.targets (1697,5) : 경고 MSB3245 :이 참조를 확인할 수 없습니다. 어셈블리 "System.Web.Razor, 버전 = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35, processorArchitecture = MSIL"을 찾을 수 없습니다. 디스크에 어셈블리가 있는지 확인하십시오. 코드에이 참조가 필요한 경우 컴파일 오류가 발생할 수 있습니다.

결과적으로 필요한 것은 다음 중 하나입니다.

  1. 어셈블리에 대한 참조를 수동으로 추가 (디스크, GAC에 위치시키고 "직접"참조로 추가)
  2. 갤러리에 게시 된 경우 NuGet 패키지를 사용하여 패키지를 다운로드하고 패키지에 포함 된 어셈블리를 참조하십시오.

NuGet 갤러리에 대한 자세한 내용은 여기를 참조하십시오 . ASP.NET 뷰 사전 컴파일에 대한 자세한 내용은 여기를 참조하십시오 .


VS 2017에서 "MSBuild 프로젝트 빌드 출력 상세 정보"(로그 파일 아님)를 Detailed (진단 아님)으로 설정하면 출력 창에 "조립품을 찾을 수 없습니다"오류가 발생합니다.
ALEXintlsos

@ALEXintlsos : 분명히이 기능이 변경되었습니다. 여전히 당신은 어디에 있든 오류가 발생했습니다. 제거하려면 지시를 따르십시오.
Alexander Christov

22

Visual Studio에서 빌드 세부 정보를 변경하면 올바른 방향을 가리키는 데 도움이됩니다. VS에서 세부 정보를 변경하려면 아래 단계를 따르십시오.

  1. VS의 도구-> 옵션 메뉴로 이동하십시오.
  2. 프로젝트 및 솔루션 열기-> 빌드 및 실행
  3. MSBuild 프로젝트 빌드 출력 상세 값을 변경하십시오. 에서 하나를 선택 Quiet, Minimal, Normal, DetailedDiagnostic

VS에서 출력 창 ( Ctrl+ Alt+ O)을 확인하여 빌드 로그의 변경 사항을 확인하십시오.


16

그런 다음 어떻게 경고를 없애나요?

당신은 아마해야 할거야 다시 설치 하거나이 문제를 해결하기 위해 NuGet 패키지를 업그레이드합니다.


2
이것은 패키지를 올바르게 다시 설치하지 않을 때 Visual Studio를 다시 시작하는 조합으로 문제를 해결했습니다.
Ohad Schneider

22
확인하는 가장 간단한 방법 : 솔루션을 마우스 오른쪽 버튼으로 클릭-> Manage NuGet packages for solution-> Consolidate동일한 패키지의 다른 버전이 설치되어 있는지 확인할 수 있습니다.
elshev

16

@elshev의 의견 중 하나 반복하기 솔루션-> 솔루션의 NuGet 패키지 관리-> 통합 아래에서 동일한 패키지의 다른 버전이 설치되어 있는지 확인할 수 있습니다. 패키지를 업데이트하십시오. 충돌 오류가 해결되었습니다.


1
이것은 나를 위해 해결되지 않았습니다. Newtonsoft.JSON을 제거하고 NuGet을 통해 다시 설치해야했습니다. 이것은 다른 패키지에 대한 종속성을 업데이트했습니다.
Garr Godfrey

이것은 DLL의 누락 된 참조를 자동으로 추가하는 Resharper와 같은 도구를 사용할 때도 발생했습니다. "항상 nuget을 사용하여 추가하십시오"는 좋은 제안이 될 수 있습니다.
Shaswat Rungta

패키지를 제거하면 패키지 충돌로 인해 발생할 수없는 빌드를 시도하기 때문에 작동하지 않습니다. 따라서 패키지를 다시 설치할 수조차 없습니다. (
nickornotto

8

Visual Studio 2017을 사용하고 있으며 Nuget 패키지를 업데이트 할 때이 문제가 발생했습니다. 나를 위해 일한 것은 web.config파일 을 열고 <runtime><assemblyBinding>노드를 찾아 삭제하는 것이 었습니다. web.config프로젝트를 저장 하고 다시 빌드하십시오.

Error List창문 좀 봐 구속력있는 충돌에 대한 매우 긴 경고의 모양을 확인할 수 있습니다. 두 번 클릭 <runtime><assemblyBinding>하면 올바른 매핑으로 블록 이 자동으로 다시 생성됩니다 .



3

너겟 패키지로 웹 프로젝트에 Newtonsoft Json을 설치하면이 문제를 해결할 수 있습니다.


3

분명히이 원인에 대한 많은 다른 원인과 많은 해결책이 있습니다. 내 프로젝트를 혼합하기 위해 이전에 웹 프로젝트에서 직접 참조한 어셈블리 (System.Net.Http)를 NuGet에서 관리하는 버전으로 업그레이드했습니다. 이로 인해 해당 프로젝트 내에서 직접 참조가 제거되었지만 테스트 프로젝트에는 여전히 직접 참조가 포함되었습니다. NuGet 관리 어셈블리를 사용하도록 두 프로젝트를 업그레이드하면 문제가 해결되었습니다.



1

때로는 nuget 패키지가 .NET Core 필수 구성 요소 또는 이미 설치된 프레임 워크와 충돌하는 기타 항목을 설치한다는 것을 알았습니다. 내 해결책은 프로젝트 (.csproj) 파일을 열고 해당 참조를 제거하는 것이 었습니다. 예를 들어 System.IO, System.Threading 등은 최근에 설치된 NuGet 패키지를 통해 Microsoft.Bcl이 포함 된 경우 추가되는 경향이 있습니다. 내 프로젝트에서 특정 버전의 버전을 사용할 이유가 없으므로 참조와 프로젝트 빌드를 제거합니다. 희망이 도움이됩니다.

프로젝트 파일에서 "참조"를 검색하고 충돌을 제거 할 수 있습니다. 시스템에 포함되어 있으면 제거하고 빌드가 작동합니다. 이 문제의 모든 경우에 해당되는 것은 아닙니다. 본인에게 도움이되었는지 확인합니다. :)

내가 언급 한 것의 예 :

<!-- <Reference Include="System.Runtime, Version=2.6.9.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> -->
  <!-- <HintPath>$(SolutionDir)packages\Microsoft.Bcl.1.1.9\lib\net40\System.Runtime.dll</HintPath> -->
  <!-- <Private>True</Private> -->
<!-- </Reference> -->


1

나는 여기에 몇 가지 답변의 조언을 따라 무엇이 잘못되었는지 알아 냈지만, 그 해결 방법을 설명하는 답변은 없었습니다. 내 문제는 하나의 참조에 다른 버전의 두 번째 참조가 필요하다는 것입니다. 따라서 Newtonsoft는 버전 6이지만 다른 DLL은 4.5를 원했습니다. 그런 다음 다른 답변 중 하나가 제안하고 Newtonsoft를 업그레이드하여 상황이 악화되었습니다.

그래서 실제로 Newtonsoft 설치를 다운 그레이드하고 경고가 사라졌습니다 (VS 2017).

솔루션 탐색기에서 참조를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리 ...를 선택하십시오. "설치"탭에서 Newtonsoft (또는 충돌이 무엇이든)를 찾으십시오. 오른쪽에서 "버전"옆에 이전 버전으로 변경할 수있는 드롭 다운이 나타납니다. 버전. 이 드롭 다운을 다운 그레이드하는 데 사용할 수 있다는 것은 분명하지 않았습니다.


1

문제를 쉽게 찾을 수 있도록 전체 진단 세부 정보로 Dotnet CLI를 실행할 수 있습니다.

dotnet run --verbosity diagnostic >> full_build.log

빌드가 완료되면 로그 파일 (full_build.log)을 통해 오류를 검색 할 수 있습니다. 예를 들어 "충돌"을 검색하면 문제가 발생합니다.


0

Manage NuGet Packagaes에서 Microsoft ASP.NET MVC nuget.org를 제거하고 다시 설치했습니다. 다시 설치하는 동안 면도기 버전과 관련된 모든 충돌이 해결되었습니다. 시도 해봐 .


0

MSBuild 세부 정보를 Diagnostic.로 변경했지만 위의 답변에 따라 문제가 발생한 위치를 찾을 수 없습니다 .app.config 에이 코드가 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="XbimXplorer.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>

그래서 첫 번째 시스템, 버전을 4.0.0.0에서 12.0.0.0으로 변경했는데 프로젝트가 효과가있었습니다.


0

다른 답변에 따라 출력 로깅 수준을 자세하게 설정하고 충돌을 검색하면 다음에 볼 위치를 알려줍니다.

필자의 경우 소스의 출처를 찾기 위해 몇 가지 방향으로 나를 보냈지 만 결국 문제는 휴대용 클래스 라이브러리 프로젝트 중 하나였으며 잘못된 버전을 대상으로하고 자체 버전을 가져 왔습니다. 참조의 버전, 따라서 충돌. 빠른 대상 변경 및 문제가 해결되었습니다.


0

방금 nuget에서 로컬 참조 dll로 패키지를 전환 한 후 이것과 문제에 부딪 쳤습니다. 문제는의 이전 런타임 바인딩 관련 문제였습니다 app.config.


0

패키지 참조로 마이그레이션 한 후이 경고가 발생했습니다. 진단 출력에서 ​​라이브러리가 동일한 라이브러리 자체에서 참조되었다는 정보가있었습니다. 새 패키지 참조의 버그 일 수 있습니다. 해결책은 AutoGenerateBindingRedirects를 활성화하고 사용자 정의 바인딩 리디렉션을 삭제하는 것이 었습니다.


0

VS 2017, MVC 프로젝트

이유를 모르지만이 문제에 대한 해결책 out은 컨트롤러 작업 메소드에서 호출 된 모델 메소드 서명에서 매개 변수 를 제거하는 것이 었습니다. 그것은 매우 이상한 행동이지만 그것은 내 문제의 해결책이었습니다.


-2

Update-Package패키지 관리자 콘솔을 통해 명령 실행

이렇게하면 MSB3277, 모든 패키지 및 패키지와 함께 제공되는 모든 관련 어셈블리를 최고 버전으로 다시 설치하는 문제가 해결됩니다 . 특정 패키지 만 업데이트 할 수도 있습니다. 또는 원하는 경우 업데이트 후 다운 그레이드하면이 문제가 몇 번 발생했습니다. 사용하는 너겟 패키지 수에 따라이 프로세스는 몇 분이 걸릴 수 있습니다.

공식 문서에 대한 자세한 정보 https://docs.microsoft.com/en-us/nuget/consume-packages/reinstalling-and-updating-packages


14
이 조언은 종종 프로덕션 코드와 같은 최신 패키지를 원하지 않으면 하루를 망칠 수 있습니다.
Tony O'Hagan

1
이 내용은 조언에 표시되며 문제가 될 수있는 문제는 안전하고 쉬운 문제 해결 방법이므로 사람들의 의견을 무시하지 마십시오.
Aistis Taraskevicius

1
이 솔루션은 저에게 효과적이지 않았습니다. 나는 이미 모든 최신 버전을 가지고있었습니다.
Zero3

ZERO3 당신이 직접 패키지를 지정하지 않고, 상위 솔루션에서 그것을 실행이 @, 그것은 보통 일이 missmatches 원인이 무엇 매 일 업데이트 참조, 다시 설치하기 때문에
Aistis Taraskevicius

3
이것은 정말 끔찍한 조언입니다. 패키지를 업데이트하면 의도적으로 수행되지 않으면 코드가 손상되는 것은 아닙니다.
TheBatman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.