2011-01-12 3 views
4

예외는 다음과 같습니다.Assembly.LoadFile()은 매니페스트 누락에 대한 예외를 throw합니다.

모듈에 어셈블리 매니페스트가 포함될 것으로 예상됩니다. (HRESULT에서 예외 : 0x80131018)

나는 라인에서 얻을 :

Assembly lvAssembly = Assembly.LoadFile(aPathFileName); 

로드되는 파일이 다른 응용 프로그램에 의해 생성되는 플러그인입니다. 플러그인의 타겟 프레임 워크 버전을 4.0에서 3.5로 변경하고 다시 컴파일하면. 플러그인이 잘로드됩니다. Assembly.LoadFile 메서드가 플러그인이 컴파일 된 .net 프레임 워크의 버전을 신경 쓰는 이유를 모르겠습니다.

플러그인을 4.0으로로드하는 응용 프로그램의 대상 프레임 워크를 변경해도 도움이되지 않았습니다.

+0

aPathFileName이 "실제".net 어셈블리 (win32 dll이 아닌)를 가리 킵니까? –

답변

6

질문의 첫 번째 부분은 예상 결과이며 CLR 버전 2는 .NET 4.0 어셈블리를로드 할 수 없으며 메타 데이터 형식이 변경되었습니다.

마지막 단락은 설명하기가 어렵습니다. 그것은 LoadFile()을 사용하는 것과 관련이 있을지도 모릅니다. 이것은 어셈블리를로드하기위한 불법적 인 방법입니다. 가능한 한 실패 모드는 플러그인 어셈블리에 여전히 2.0 어셈블리에 대한 참조가있을 수 있다는 것입니다. 이전 프레임 워크를 목표로 컴파일 된 또 다른 어셈블리에 대한 참조가있을 때 이것은 매우 정상입니다. 이것은 일반적으로 어셈블리 로더에 의해 자동으로 해결되며 2.0 참조를 해당 4.0 참조로 바꿉니다.

ildasm.exe를 사용하여이 이론을 검증하고 플러그인 어셈블리에서 실행하고 .assembly 지시문에 대한 매니 페스트를 조사 할 수 있습니다. 버전 번호는 쉽게 알 수 있습니다.

.assembly extern mscorlib as mscorlib_2 
{ 
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89) 
    .ver 2:0:0:0 
} 

항상 선호합니다. Assembly.LoadFrom().

+0

ildasm.exe를 실행했는데 동일한 결과가 나타납니다. 그렇다면 플러그인에서 2.0 어셈블리를 참조 할 수 없다는 뜻입니까? – scott

+0

와우, 초능력 디버깅을위한 점수 하나. 종속 어셈블리도 다시 빌드하십시오. 또는 LoadFrom()을 사용하십시오. –

관련 문제