2010-07-03 6 views
2

자체적으로 EXE를 생성하는 어셈블리를 동적으로로드하는 동안 C++/CLI에서 예외가 발생합니다. Assembly.Load을 사용하는 C++/CLI 관리 모드. 그것은 성공적으로 DLL 어셈블리를로드하지만, EXE 어셈블리를로드하는 데 실패하고 다음과 같은 예외가 생성예외 발생 C++/CLI에서 동적으로 EXE 어셈블리를로드하는 중 (파일 또는 어셈블리 '를로드 할 수 없음, 버전 = 1.0.3836.39802 ...)

유형 'System.IO.FileLoadException'의 처리되지 않은 예외가 에게

파일을로드 할 수 없습니다

TestManager.dll 발생을 또는 어셈블리 'testAssembly, 버전 = 1.0.3836.39802, 문화 = 중립, PublicKeyToken = null'또는 종속성 중 하나. fixups` 함께 확인할 수없는 실행을로드하려고 HRESULT에서

예외 (2 개 이상의 부분 또는 TLS 부와 IAT는.) : 0x80131019

TestManager.dll 자체 관리 DLL이고 다른 CLR에로드 프로세스를 CLI에서 처리하고 EXE 어셈블리를 별도의 프로세스로로드하려고 시도하지만 실패하고 예외가 발생합니다.

이것은 아마도 혼합 모드로 재생할 수 있기 때문일 수 있습니다.

답변

4

"참조 된 어셈블리로로드 할 때 혼합 모드 C++ EXE를 메모리에서 올바르게 재배치 할 수 없으므로 런타임 오류가 발생합니다."

견적은 Connect에서 Microsoft's response to this bug입니다. 여기에서는 수정하지 않을 것이라고 설명합니다 (드문 상황에 너무 많은 문제가 있음).

+0

참조 된 EXE 어셈블리는 관리되는 모드 C++/CLI로 작성되었으며 네이티브 환경에서 완료된 EXE를 참조하지도 않습니다. 그러나 관리되는 dll 인 로더 어셈블리는 혼합되어 있으며 일부 원시 함수를 호출하고이 관리되는 EXE를로드합니다. 여기서 예외를 생성합니다. – Usman

+0

구문 분석에 실패했습니다. 혼합 된 어셈블리와 관리되는 어셈블리에 대한 명확한 설명을 사용하여 질문을 편집 할 수 있습니까? 그들을 명명하면 명확하게하는 데 도움이됩니다. –

0

.NET에서 프로세스 간 통신을 위해 명명 된 파이프를 사용해야한다고 생각합니다. Assembly.Load는 EXE 어셈블리에서 작동하지 않습니다.

1

TL; DR은 : /clr/clr:pure로부터 상기 CLR 지원을 변경하여 관리되는에만 혼합에서 조립식 변경.

세부 사항 : 그들 중 일부는 네이티브 DLL을 가져올 수 있기 때문에 모든 /clr 컴파일,
나는 다양한 관리 DLL을 가지고 :

는 오늘 매우 비슷한 상황이 있었다.
EXE도 있고 /clr으로 컴파일되었습니다.
모두 C++/CLI로 작성되었습니다.

지금까지 모든 사용자 정의 컨트롤은 DLL에있었습니다. 오늘 나는 EXE 어셈블리에서 UC를 만들었고이 UC를 EXE의 메인 폼에 삽입하려고했습니다. 실패했으며 방금 말했다.

도구 상자 항목을로드하지 못했습니다. 도구 상자에서 제거됩니다.

다른 방법은 없습니다.

그래서 새로운 winforms 프로젝트를 만들고 EXE에 대한 참조를 추가하고 Visual Studio Designer 도구 상자에 EXE 컨트롤을 추가하려고했습니다. 마지막 동작이 실패했습니다. 오류 메시지는

수정이 가능한 확인 불가능한 실행 파일 (2 개 이상의 섹션 또는 TLS 섹션이있는 IAT)을로드하려고 시도합니다.) 나는 @Stephen가 분명 위의

인용이 유래 게시물을 발견 번째 실패 메시지와

"A 혼합 모드 C++ EXE가 이 참조 된 어셈블리로로드 제대로 할 때 메모리에 재배치 할 수 없습니다. 이것이 런타임에 오류가 발생하는 이유입니다. "

MSDN에서. 이것은 메시지가 옳다면 혼합 모드 어셈블리 EXE로 컴파일하고 있음을 의미합니다. 그래서 내가 조립품의 유형을 바꿀 수있는 곳을 찾은 후 Mixed (Native and Managed) Assemblies을 MSDN 에서 찾아 보았습니다. 자세한 설명이있는 페이지로 연결되며 그 중 하나는 Pure and Verifiable Code (C++/CLI)입니다. 거기 나는 /clr:pure를 사용해야한다는 것을 알았다.

DLL이 아닌 내 EXE 어셈블리에 대한이 설정을 변경 한 후에도 테스트 프로젝트의 VS Designer Toolbox에 추가하고 UC를 EXE의 기본 폼에 추가 할 수있었습니다.