2013-05-23 3 views
0

Managed C++ dll에 링크해야하는 여러 개의 관리되지 않는 C++ 작성된 lib 파일이 있습니다.
그런 다음 C# 응용 프로그램에서이 Managed C++의 함수를 호출해야합니다.{dll}에서 가져온 프로 시저를로드 할 수 없습니다.

첫 번째 단계는 정상입니다. - Managed C++ dll이 만들어지면 ildasm에서 필요한 기능을 내보낼 수 있습니다. 나는 내 C# -written 테스트 응용 프로그램에서이 함수를 호출 할 때 그러나 말한다 :

유형 'System.IO.FileLoadException'의 처리되지 않은 예외가 알 수없는 모듈에서 발생했습니다.
{MyManagedCPP.dll}에서 가져온 프로 시저를로드 할 수 없습니다.

이 메시지는 VS2010에서 발생합니다.
Managed C++ dll의 모든 lib 파일에서 간단한 실험 - 제거 된 종속성을 제거하고 다시 빌드했습니다.
이 변경으로 괜찮습니다 - 응용 프로그램이 시작되면 C# 테스트 응용 프로그램에서 Managed C++ dll의 함수를 호출 할 수 있습니다.

dll이 lib 파일과 정적 링크가있을 때 관리되는 C++ 함수를 호출 할 수 있습니까? 기술 제한? 아니면 몇 가지 해결 방법이 있습니까?

감사

+0

System.Runtime.InteropServices를 살펴보십시오. 특별히'DllImport [ "my.dll ']'.Dll을 어디에 둘 것인지주의하십시오 (프로젝트에 의해 정의 된 작업 디렉토리에 있어야하며 반드시 exe 옆에있을 필요는 없습니다) – axon

+0

아니요, 저는 생각하지 않습니다. 여기에 DLLImport가 필요합니다. 결국 DLL을 관리하고 exe를 관리합니다. [DLLImport] "속성이있는 메서드가 관리되지 않는 동적 연결 라이브러리 (DLL)에 의해 정적 진입 점으로 표시됨을 나타냅니다." – IgorStack

답변

1

당신은 의심의 여지가 네이티브 DLL에 암시 적 종속성이 없습니다. DLL에서 어떤 DLL인지는 분명하지 않습니다. msvcrxx.dll (예 : 네이티브 C++ 코드 용 런타임 지원 라이브러리) 일 수 있습니다. 어느 것이 나쁘겠습니까, 당신은 CRT 버전을 혼합하고 싶지 않습니다. 이러한 누락 된 DLL은 그렇지 않으면 C++/CLI 어셈블리가로드되어 FileLoadException을 생성하는 것을 방지합니다.

DLL이 무엇인지 잘 모르겠 으면 SysInternals의 ProcMon 유틸리티를 사용할 수 있습니다. 추적 프로그램은 DLL을 검색하고 찾지 못하는 프로그램을 보여줍니다. msvcrxx.dll 인 경우 C++/CLI 어셈블리를 빌드하는 데 사용한 것과 동일한 컴파일러 버전을 사용하여 .lib 파일을 다시 작성해야합니다. 그것이 다른 것이라면 그 DLL을 빌드 디렉토리에 복사하십시오.

+0

슬프게도 lib 파일을 다시 빌드 할 수 없습니다. 소스가 없으며 VS2010을 사용하는 동안 VS2008을 사용하여 빌드 된 것입니다. 오류가 발생하면 관리되는 dll이로드되고 관리되지 않는 dll (어떤 관리 대상이 종속되어 있는지)도로드됩니다. 다른 버전의 컴파일러에서 문제가있는 것 같습니다. – IgorStack

+0

기술적으로는 기술적으로 DLL이 잘 설계된 경우 불일치가 발생합니다. 그러나 FileLoadException을 해결하려면 컴퓨터에 올바른 버전의 msvcr90.dll이 있어야합니다. –

관련 문제