[c#] 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다.



14 Answers

이 문제를 해결하기 위해 몇 가지 작업을 수행 할 수 있습니다. 먼저 Windows 파일 검색을 사용하여 하드 드라이브에서 어셈블리 (.dll)를 검색하십시오. 결과 목록을 얻은 다음보기 -> 세부 정보 선택 ...을 선택하고 "파일 버전"을 선택하십시오. 이렇게하면 결과 목록에 버전 번호가 표시되므로 이전 버전의 출처를 확인할 수 있습니다.

또한 Lars가 말했듯이 GAC에서 어떤 버전이 나열되어 있는지 확인하십시오. 이 Microsoft 문서 에서는 GAC에서 발견 된 어셈블리는 빌드 중에 로컬로 복사되지 않으므로 모두 다시 빌드하기 전에 이전 버전을 제거해야 할 수도 있습니다. (당신을 위해 배치 파일을 만드는 방법에 대한 노트는 이 질문에 대한 내 대답을 참조하십시오)

이전 버전의 출처를 여전히 파악할 수 없다면 Visual Studio와 함께 제공되는 fuslogvw.exe 응용 프로그램을 사용하여 바인딩 실패에 대한 자세한 정보를 얻을 수 있습니다. Microsoft는이 도구에 대한 정보를 here . HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion\EnableLog 레지스트리 키를 1로 설정하여 로깅을 설정해야합니다.

Question

C # Windows Forms 응용 프로그램 (Visual Studio 2005)에서 일부 단위 테스트를 실행하려고하는데 다음 오류가 발생합니다.

System.IO.FileLoadException : 파일 또는 어셈블리 '유틸리티, 버전 = 1.2.0.200, 문화 = 중립, PublicKeyToken = 764d581291d764f7'또는 해당 종속성 중 하나를로드 할 수 없습니다. 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT 예외 : 0x80131040) **

x.Foo.FooGO ()에서

Foo.cs에서 x.Foo.Foo2 (String groupName_) : 123 행

FooTests.cs에서 x.Foo.UnitTests.FooTests.TestFoo () : line 98 **

System.IO.FileLoadException : 파일 또는 어셈블리 '유틸리티, 버전 = 1.2.0.203, 문화 = 중립, PublicKeyToken = 764d581291d764f7'또는 해당 종속성 중 하나를로드 할 수 없습니다. 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT 예외 : 0x80131040)

필자의 참고 문헌을 Utility version 1.2.0.203 대한 참조 만 Utility version 1.2.0.203 (다른 하나는 오래되었습니다).

이 DLL 파일의이 이전 버전을 참조하려고하는 것이 무엇인지 알아내는 방법에 대한 제안 사항은 무엇입니까?

게다가, 나는 내 하드 드라이브에이 오래된 어셈블리가 있다고 생각하지 않는다. 이 오래된 버전이있는 어셈블리를 검색 할 수있는 도구가 있습니까?




AssemblyInfo.cs 파일의 AssemblyVersion에서 *를 지정하는 대신 고정 된 버전 번호를 사용하십시오. *는 각 컴파일에서 버전 번호를 변경합니다. 제 경우에는 예외였습니다.




Visual Studio를 사용하는 경우 "솔루션 정리"를 시도한 다음 프로젝트를 다시 작성하십시오.




다음은 모든 어셈블리 버전을 버전 3.1.0.0으로 리디렉션합니다. App.config에서이 참조를 항상 업데이트하는 스크립트가 있으므로이 문제를 다시 처리 할 필요가 없습니다.

리플렉션을 통해 어셈블리 publicKeyToken을 가져 와서 .dll 파일 자체에서이 블록을 생성 할 수 있습니다.

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
 <dependentAssembly>
    <assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="3.1.0.0" />
  </dependentAssembly>
</assemblyBinding>

XML 네임 스페이스 속성 (xmlns)이 없으면 작동하지 않습니다.




나는 같은 오류가있어 ... 내 경우에는 다음과 같이 해결 됐어 :

  • 처음에 응용 프로그램이 설치되었을 때 여기 사람들은 응용 프로그램에서 Microsoft Enterprise Library 4.1을 사용했습니다.
  • 지난 주에 제 컴퓨터가 포맷되었고 그 후에 오늘 제가 그 응용 프로그램을 만들었을 때 엔터프라이즈 라이브러리 어셈블리가 없다는 오류가있었습니다.
  • 그런 다음 Google에서 첫 번째 검색 항목으로 얻은 Microsoft Enterprise Library 5.0을 설치했습니다.
  • 그런 다음 응용 프로그램을 만들면 위의 오류가 발생했습니다. 즉, 위치가 지정된 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다.
  • 검색 작업 및 분석을 많이 한 후 응용 프로그램이 4.1.0.0을 참조하고 bin 폴더의 DLL이 5.0.0.0 버전임을 확인했습니다.
  • 내가 한 것은 Microsoft Enterprise Library 4.1을 설치 한 것입니다.
  • 이전 참조 (5.0)를 제거하고 4.0 참조를 추가했습니다.
  • 응용 프로그램을 작성하고 실은 ... 작동했습니다.



리플렉션을 사용하여 늦게 바인드하려고하면 바인딩하려는 어셈블리의 이름이 강하거나 공개 키 토큰이 변경된 경우 똑같은 오류가 발생합니다. 실제로 지정된 공용 키 토큰으로 발견 된 어셈블리가 없더라도 오류는 동일합니다.

오류를 해결하려면 올바른 공용 키 토큰을 추가해야합니다 (dll에서 sn -T를 사용하여 가져올 수 있음). 희망이 도움이됩니다.




필자의 경우이 오류는 ASP.NET 응용 프로그램을 실행하는 동안 발생했습니다. 해결 방법은 다음과 같습니다.

  1. 프로젝트 폴더에서 objbin 폴더 삭제

Clean은 작동하지 않았고, 재 작성은 작동하지 않았으며, 모든 참조는 괜찮 았지만 라이브러리 중 하나를 작성하지 않았습니다. 이러한 디렉토리를 삭제하면 모든 것이 완벽하게 작동합니다.




내부 패키지 저장소를 사용하는 중에이 문제가 발생했습니다. 메인 패키지를 내부 리포지토리에 추가했지만 패키지의 종속성은 추가하지 않았습니다. 의존성, 의존성 의존성, 반복성 등을 내부 리포지토리에 추가해야합니다.




NuGet 패키지를 추가하여 이전 버전의 라이브러리를 참조하는 응용 프로그램의 블랙 박스 부분만을 실현했습니다.

패키지를 제거하고 이전 버전의 정적 DLL 파일을 참조했지만 web.config 파일은 다음과 같이 업데이트되지 않았습니다.

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="6.0.0.0" />
</dependentAssembly>

패키지를 제거 할 때 되돌려 야 할 사항 :

<dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>



내 app.config에

<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.11.0"/>

npgsql의 경우. 어쨌든 사용자의 컴퓨터에서 내 app.exe.config가 누락되었습니다. 어리석은 사용자인지, 설치 프로그램 결함인지, 바이러스 백신을 아직 해킹했는지 확실하지 않습니다. 파일을 대체하면 문제가 해결됩니다.




Team Foundation Server의 빌드 서비스를 빌드하는 동안이 오류가 발생했습니다. NuGet으로 추가 된 동일한 라이브러리의 서로 다른 버전을 사용하여 솔루션에서 여러 프로젝트를 수행 한 것으로 나타났습니다. NuGet을 사용하여 모든 이전 버전을 제거하고 새로운 버전을 모두 참조로 추가했습니다.

Team Foundation Server는 모든 DLL 파일을 하나의 디렉터리에 저장하며 한 번에 특정 이름의 DLL 파일이 하나만있을 수 있습니다.




제 경우에는 의자와 키보드 사이에 문제가있었습니다 :-)

Could not load file or assembly 'DotNetOpenAuth.Core, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=2780ccd10d57b246' or one of its dependencies.
The located assembly's manifest definition does not match the assembly reference.
(Exception from HRESULT: 0x80131040)

두 개 이상의 서로 다른 어셈블리가 DotNetOpenAuth 라이브러리의 다른 버전을 사용하려고했는데 문제가되지 않았습니다. 또한 내 로컬 컴퓨터에서 web.config가 NuGet에 의해 자동으로 업데이트되었습니다.

<dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
    </dependentAssembly>
    <dependentAssembly>
        <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.3.0.0" newVersion="4.3.0.0" />
</dependentAssembly>

그런 다음 새로운 web.config를 프로덕션 서버에 복사 / 배포하는 것을 잊었습니다. 따라서 web.config를 수동으로 배포하는 방법이 있으면 업데이트되었는지 확인하십시오. 프로덕션 서버용 web.config와 완전히 다른 경우 NuGet을 사용한 후 이러한 dependentAssembly 섹션을 동기화해야합니다.




나는 누군가를 내 전단 어리 석음으로 누리게 할 것이다. 필자는 완전히 별개의 응용 프로그램에 대한 종속성을 가지고 있습니다 (이 App1을 호출합시다). 해당 App1의 dll은 새 응용 프로그램 (App2)으로 가져옵니다. APP1에서 업데이트 할 때마다 새 DLL을 만들어 App2에 복사해야합니다. 잘. . . 나는 두 개의 서로 다른 App1 버전 사이에서 복사하고 붙여 넣는 것에 질려있어 dll에 'NEW_'라는 접두어를 추가했다.

잘. . . 빌드 프로세스가 / bin 폴더를 스캔하고, 잘못 일치하는 부분을 찾았을 때 위와 같은 오류 메시지가 표시됩니다. 내 "new_"버전을 삭제하고 그냥 멋쟁이를 만들었습니다.




AssemblyVersion 태그와 함께 AssemblyInfo.cs를 사용하고 .csproj 파일의 값이 다른 경우에도 발생할 수 있습니다. AssemblyInfo를 일치 시키거나 섹션을 모두 제거하면 문제가 사라집니다.




나에게 "Local.testtesttings"파일의 코드 커버리지 설정은 문제를 야기했다. 거기에서 참조 된 파일을 업데이트하는 것을 잊었습니다.




Related