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

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

System.IO.FileLoadException : 파일 또는 어셈블리 ‘Utility, Version = 1.2.0.200, Culture = neutral, PublicKeyToken = 764d581291d764f7’또는 해당 종속성 중 하나를로드 할 수 없습니다. 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT 예외 : 0x80131040) **

x.Foo.FooGO ()에서

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

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

System.IO.FileLoadException : 파일 또는 어셈블리 ‘Utility, Version = 1.2.0.203, Culture = neutral, PublicKeyToken = 764d581291d764f7’또는 해당 종속성 중 하나를로드 할 수 없습니다. 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다. (HRESULT 예외 : 0x80131040)

나는 나의 참고 문헌을보고, 나는 단지 Utility version 1.2.0.203다른쪽에 대해서만 언급한다 .

이 DLL 파일의 이전 버전을 참조하려고하는 것이 무엇인지 어떻게 알 수 있습니까?

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



답변

.NET 어셈블리 로더 :

  • 1.2.0.203을 찾을 수 없습니다
  • 하지만 1.2.0.200을 찾았습니다

이 어셈블리는 요청한 것과 일치하지 않으므로이 오류가 발생합니다.

간단히 말하면 참조 된 어셈블리를 찾을 수 없습니다. GAC 또는 응용 프로그램 경로에 배치하여 올바른 조립품을 찾을 수 있는지 확인하십시오. https://docs.microsoft.com/archive/blogs/junfeng/the-located-assemblys-manifest-definition-with-name-xxx-dll-does-not-match-the-assembly-reference 도 참조 하십시오 .


답변

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

또한 Lars가 말했듯이 GAC에서 어떤 버전이 있는지 확인하십시오. 이 Microsoft 기사에 따르면 GAC에서 찾은 어셈블리는 빌드 중에 로컬로 복사되지 않으므로 모두 다시 빌드하기 전에 이전 버전을 제거해야 할 수 있습니다. ( 이를 위해 배치 파일을 만드는 방법에 대한 참고 사항은 이 질문에 대한 내 대답을 참조하십시오 )

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


답변

방금이 문제에 부딪 쳤고 다른 사람들이 겪었던 것과 다른 문제가 있음을 알았습니다.

내 주요 프로젝트가 참조하는 두 개의 DLL, CompanyClasses.dll과 CompanyControls.dll이 있습니다. 런타임 오류가 발생했습니다.

파일 또는 어셈블리 ‘CompanyClasses, Version = 1.4.1.0, Culture = neutral, PublicKeyToken = 045746ba8544160c’또는 해당 종속성 중 하나를로드 할 수 없습니다. 찾은 어셈블리의 매니페스트 정의가 어셈블리 참조와 일치하지 않습니다

문제는 버전 번호가 1.4.1 인 시스템에 CompanyClasses.dll 파일이 없다는 것입니다. GAC에는 없으며 앱 폴더에는 없습니다. 하드 드라이브 전체를 검색했습니다. 내가 가진 모든 CompanyClasses.dll 파일은 1.4.2입니다.

실제 문제는 CompanyControls.dll이 CompanyClasses.dll의 버전 1.4.1을 참조한다는 것입니다. 방금 CompanyControls.dll을 다시 컴파일하고 (CompanyClasses.dll 1.4.2를 참조한 후)이 오류가 사라졌습니다.


답변

다음은 모든 어셈블리 버전을 버전 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)이 없으면 작동하지 않습니다.


답변

Visual Studio를 사용하는 경우 “clean solution”을 시도한 다음 프로젝트를 다시 빌드하십시오.


답변

다른 답변은 저에게 효과적이지 않습니다. 버전에 신경 쓰지 않고 앱을 실행하려면 참조를 마우스 오른쪽 버튼으로 클릭하고 ‘특정 버전’을 false로 설정하십시오 … 이것은 저에게 효과적이었습니다.
여기에 이미지 설명을 입력하십시오


답변

방금이 문제를 겪었고 문제는 내 응용 프로그램 디버그 디렉토리에 .dll의 오래된 사본이 있다는 것입니다. GAC 대신 확인하여 확인할 수도 있습니다.