2013-02-23 4 views
0

나는 기본적으로 어디에서 플러그 인 응용 프로그램 환경이 있습니다관리 C DLL을, FileNotFoundException이

호스트 응용 프로그램은 C#을 DLL로 호출 관리되는 C++ DLL로 호출 ++ DLL을 관리되지 않는 C를 호출을

이는 관리되지 않는 C++에서 C#으로 브릿지를 사용하여 호출하는 방법으로 잘 알려져 있습니다. 이 모든 것은 잘 작동하며, 내 dll (관리되지 않는 C++, 관리되는 C++ 및 C#)이 dll을 호출하는 응용 프로그램과 동일한 디렉토리에없는 플러그 인 유형 아키텍처를 제외하고 대부분의 상황에서 잘 작동합니다. 응용 프로그램이 관리되지 않는 C++을 호출 할 때 응용 프로그램이 dll을로드하기 위해 호출 할 디렉토리를 알고 있기 때문에 모두 잘 작동합니다. 그러나 처음 관리되지 않는 C++이 관리되는 C++로 호출하면 FileNotFoundException이 발생합니다. C# dll을 찾지 못했다는 것을 알 수 있습니다 (세 개의 dll은 모두 같은 디렉토리에 있으며 app 디렉토리에는 없습니다). 모든 dll을 exe의 런타임 디렉토리에 저장하면 모든 것이 완벽하게 작동하며 FileNotFoundException을 얻지 못합니다. 하지만 배포 할 때 호출하는 응용 프로그램을 제어 할 수 없으므로 런타임 DLL에 DLL을 삭제할 수 없습니다.

그래서 관리되지 않는 C++ dll이로드 될 때 관리되지 않는 C++ 코드에서 프로그래밍 방식으로 C# dll에 대한로드 디렉토리를 설정할 수 있습니까? SetDllDirectory 시도하고 내 dlls 상주하는 디렉터리에 대한 시스템 성공하지 경로 변수를 설정합니다.

+0

몇 가지 코드를 게시 할 수 있습니까? 예외를 throw하는 API는 무엇입니까? –

답변

1

CLR은 어셈블리에 대해 기본적으로 두 위치 만 찾습니다. GAC 첫 번째는 EXE가 두 번째로 시작된 디렉터리입니다. 다른 곳을 보게하려면 추가 작업이 필요합니다. 한 가지 가능성은 테이블에서 벗어 났으므로이 시나리오에서는 AppDomain.AssemblyResolve에 대한 이벤트 처리기를 구독 할 수 없습니다. 그러면 <probing> 또는 <codebase> 요소가있는 app.exe.config 파일이 남습니다. 관리되지 않는 EXE와 동일한 이름을 지정하고 EXE와 동일한 폴더에 저장해야합니다.

EXE가 너의 것이 아니고 EXE 디렉토리에서 물건을 지키는 목표를 정확히 설명하지 않는 경우 현명하지 못한 경향이 있습니다. GAC는 간단한 해결 방법입니다.

관련 문제