programing

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

easyjava 2023. 5. 9. 23:12
반응형

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

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

동일한 종속 어셈블리의 서로 다른 버전 간에 충돌을 확인할 수 없습니다.이러한 참조 충돌은 로그 상세도가 상세로 설정된 경우 빌드 로그에 나열됩니다.C:\프로그램 파일(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에 문제가 있는지 어떻게 확인하고 경고를 제거합니까?

에타: SO 자신의 @Nick Craver가 쓴 기사에 대한 살인 기사가 있습니다. 당신이 읽어야 합니다.


다른 응답자들은 이렇게 말하는 반면, 그들은 그것을 명시적으로 만들지 않기 때문에, 저는….

VS2013.2에서 인용된 정보의 방출을 실제로 트리거하려면 다음과 같은 메시지를 읽지 않아도 됩니다.

C:\프로그램 파일(x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): 주의 MSB3277: 동일한 종속 어셈블리의 서로 다른 버전 간에 충돌을 발견했지만 해결할 수 없습니다.이러한 참조 충돌은 로그 상세도가 상세로 설정된 경우 빌드 로그에 나열됩니다.

이는 올바르지 않습니다(또는 적어도 일부 Visual Studio 버전의 경우에는 문제가 없습니다. 최신 VS2015 업데이트 3 이상에서는 문제가 없는 것 같습니다).대신 진단(도구->옵션->프로젝트솔루션->빌드 및 실행, MSBuild 프로젝트 빌드 출력 상세 설정)으로 전환하면 다음과 같은 메시지가 표시됩니다.

"뉴턴소프트" 사이에 갈등이 있었습니다.Json, Version=6.0.0.0, Culture=neutral, PublicKey토큰=30ad4fe6b2a6aeed" 및 "뉴턴소프트.Json, 버전=6.0.5.17707, Culture=중립, 공개 키토큰=30ad4fe6b2a6aeed".

  • "뉴턴소프트.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aed"가 기본이고 "Newtonsoft"이기 때문에 선택되었습니다.Json, 버전=6.0.5.17707, Culture=중립, 공개 키토큰=30ad4fe6b2a6a6aed"는 그렇지 않았습니다.

그리고나서

  • Ctrl-Alt-O 출력 으로 합니다.
  • 드릴다운을 찾기 위해 "선택됨"을 검색합니다.

...그렇습니다. [진단] 메시지의 세부 사항을 보는 사람들에게, 이 무지한 사람들에게는 모든 버전이 내부적으로 어셈블리 버전, SemVer Major 구성 요소만 어셈블리 버전에 들어가는 컨벤션이 있다는 것이 새로웠습니다. :)

려달을 합니다.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" />

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

MSBuild가 입니다./v:diag장황함 그것은 다음과 같이 보였습니다.두 개의 참조가 상충되는 세부 사항을 제공합니다.

  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]

표시된 두 메시지를 비교하여 루벤의 답변을 더 뒷받침할 수 있을 뿐입니다.

여기에 이미지 설명 입력

그리고 메시지:

C:\프로그램 파일(x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): 주의 MSB3277: 동일한 종속 어셈블리의 서로 다른 버전 간에 충돌을 발견했지만 해결할 수 없습니다.이러한 참조 충돌은 로그 상세도가 상세로 설정된 경우 빌드 로그에 나열됩니다.

그래서, 루벤의 말이 맞습니다. 이것은 사실이 아닙니다.충돌은 없습니다. 어셈블리가 누락되었을 뿐입니다.이것은 프로젝트가 ASP일 때 특히 지루합니다.요청 , 즉 처음 표시되기 직전에 보기가 컴파일되므로 NET 응용 프로그램.이때 어셈블리를 사용할 수 있어야 합니다.(코드의 나머지 부분과 함께 보기를 미리 컴파일하는 옵션이 있지만, 이것은 다른 이야기입니다.반면에 상세도를 Diagnostic으로 설정하면 다음과 같은 출력이 표시됩니다.

C:\프로그램 파일(x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): 주의 MSB3245: 이 참조를 확인할 수 없습니다.어셈블리 "시스템"을 찾을 수 없습니다.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, 프로세서 아키텍처=MSIL".어셈블리가 디스크에 있는지 확인합니다.코드에 이 참조가 필요한 경우 컴파일 오류가 발생할 수 있습니다.

따라서 다음 중 하나만 수행하면 됩니다.

  1. 어셈블리에 참조를 수동으로 추가합니다(디스크 또는 GAC에서 참조를 찾아 "직접" 참조로 추가).
  2. NuGet 패키지(갤러리에 게시된 경우)를 사용하여 패키지를 다운로드하고 포함된 어셈블리를 참조합니다.

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

비주얼 스튜디오에서 빌드 상세도를 변경하면 올바른 방향을 가리킬 수 있습니다.VS에서 자세한 내용을 변경하려면 다음 단계를 따르십시오.

  1. VS의 도구->옵션 메뉴로 이동
  2. 개방형 프로젝트 및 솔루션->구축 및 실행
  3. MSBuild 프로젝트 빌드 출력 상세도 값을 변경합니다.하나만 골라주세요.Quiet,Minimal,Normal,Detailed그리고.Diagnostic

VS의 출력 창(+)CtrlAltO을 확인하여 빌드 로그의 변경 사항을 확인합니다.

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

그럼 어떻게 경고를 없애죠?

이 문제를 해결하려면 NuGet 패키지를 다시 설치하거나 업그레이드해야 합니다.

Visual Studio 2017을 사용하고 있는데 일부 Nuget 패키지를 업데이트할 때 이 문제가 발생했습니다.제게 효과가 있었던 것은 제 것을 여는 것이었습니다.web.config파일을 작성하고 다음을 수행합니다.<runtime><assemblyBinding>노드를 선택하고 삭제합니다.절약하다web.config프로젝트를 다시 빌드할 수 있습니다.

.Error List 바인딩 대한 인지 알 수 바인딩 충돌에 대한 매우 긴 경고를 볼 수 있습니다.두 번 클릭하면 자동으로 재생성됩니다.<runtime><assemblyBinding>올바른 매핑을 가진 블록.

닷넷 CLI 이슈 6583에 명시된 바와 같이 이 문제는 다음과 같이 해결되어야 합니다.dotnet nuget locals --clear all지휘권

나는 너겟 패키지로 웹 프로젝트에 뉴턴소프트 제이슨을 설치하는 것을 해결할 수 있었습니다.

분명히 많은 다른 원인들이 있고 따라서 이 문제에 대한 많은 해결책들이 있습니다.내 것을 혼합물에 넣기 위해, 우리는 어셈블리(시스템)를 업그레이드했습니다.이전에 웹 프로젝트에서 NuGet에서 관리하는 버전으로 직접 참조된 Net.Http).이렇게 하면 해당 프로젝트 내의 직접 참조가 제거되었지만 테스트 프로젝트에는 여전히 직접 참조가 포함되어 있습니다.두 프로젝트를 모두 업그레이드하여 NuGet 관리 어셈블리를 사용하면 문제가 해결되었습니다.

패키지를 변경한 경우 sln을 다시 엽니다.나한테 효과가 있었어요!

Dotnet CLI를 전체 진단 세부 정보로 실행하여 문제를 찾을 수 있습니다.

dotnet run --verbosity diagnostic >> full_build.log

빌드가 완료되면 로그 파일(full_build.log)에서 오류를 검색할 수 있습니다.예를 들어, "충돌"을 검색하면 문제로 바로 이동할 수 있습니다.

제가 이 문제를 해결한 것은 다음과 같습니다.AutoGenerateBindingRedirectsTargetFramework에 시대에csproj파일 이름:

<TargetFramework>net462</TargetFramework>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

Microsoft ASP를 제거했습니다.NuGet Packagaes 관리의 NET MVC nuget.org 을 다시 설치합니다.재설치하는 동안 면도기 버전과 관련된 모든 충돌이 해결되었습니다.먹어봐.

MSBuild 상세 정보를 진단으로 변경했습니다.그러나 문제가 어디에 있는지 찾을 수 없어서 위의 답변에 따르면 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에서 12.0.0.0으로 변경했고 제 프로젝트는 성공했습니다.

다른 답변에 따라 출력 로깅 수준을 세부 정보로 설정하고 충돌을 검색하면 다음에 찾을 위치를 알 수 있습니다.

저 같은 경우에는 참고 문헌의 출처를 찾기 위해 몇 가지 방향으로 저를 내보냈지만, 결국 문제는 제 휴대용 도서관 프로젝트 중 하나라는 것이 밝혀졌습니다. 잘못된 버전을 목표로 하고 있었고, 참고 문헌의 자체 버전을 끌어오고 있었기 때문에 갈등이 발생했습니다.빠른 재표적으로 문제가 해결되었습니다.

나는 때때로 너겟 패키지가 설치될 것이라는 것을 발견했습니다(내가 추측하는 것은).NET Core에는 이미 설치된 프레임워크와 충돌하는 구성 요소 또는 기타 항목이 필요합니다.제 해결책은 프로젝트(.csproj) 파일을 열고 이러한 참조를 제거하는 것이었습니다.예를 들어, 시스템입니다.IO, 시스템.스레드화 등은 Microsoft에서 추가하는 경향이 있습니다.Bcl은 최근에 설치된 NuGet 패키지를 통해 포함되어 있습니다. 제 프로젝트에 특정 버전이 있을 이유가 없기 때문에 참조와 프로젝트 빌드를 제거합니다.도움이 되길 바랍니다.

프로젝트 파일에서 "참조"를 검색하고 충돌을 제거할 수 있습니다.시스템에 포함된 경우 제거하면 빌드가 작동합니다.이것이 이 문제의 모든 경우에 대한 답은 아닐 수 있습니다. 무엇이 나에게 효과가 있었는지 확실히 알고 있습니다. :)

제가 언급한 내용의 예:

<!-- <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> -->

나는 방금 nuget에서 local reference dll로 패키지를 바꾼 후에 이것과 문제에 부딪혔습니다.는 문는이런바항다목니에 있는 이었습니다.app.config.

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

저는 무엇이 문제인지 알아내기 위해 여기에 있는 몇몇 응답자들의 조언을 따랐지만, 그 중 어떤 대답도 그것을 고치는 방법을 설명하는 것 같지 않았습니다.제 문제는 하나의 참조가 다른 버전의 두 번째 참조를 필요로 한다는 것이었습니다.뉴턴소프트는 버전 6에 있었지만 다른 DLL은 4.5를 원했습니다.그런 다음 다른 답변 중 하나가 제안한 대로 뉴턴소프트를 업그레이드했고 그것이 상황을 더 악화시켰습니다.

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

솔루션 탐색기에서 참조를 마우스 오른쪽 버튼으로 클릭하고 NuGet 패키지 관리...를 선택합니다.설치됨 탭에서 뉴턴소프트(또는 충돌 내용)를 찾습니다. 오른쪽에는 이전 버전으로 변경할 수 있는 드롭다운이 "버전" 옆에 나타납니다.이 드롭다운이 다운그레이드에 사용될 수 있다는 것은 확실하지 않았습니다.

VS 2017, MVC 프로젝트

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

뉴턴소프트를 설치했습니다.Json v10.0.0.3 및 Newtonsoft.Json v11.X.X.X는 NuGet Packagaes 관리에서 nuget.org 과 다른 프로젝트를 수행하고 다시 설치했습니다(동일 버전).재설치하는 동안 면도기 버전과 관련된 모든 충돌이 해결되었습니다.날 위해 일해요!

언급URL : https://stackoverflow.com/questions/24772053/found-conflicts-between-different-versions-of-the-same-dependent-assembly-that-c

반응형