2011-11-26 2 views
0

C++ DLL 주위에 관리되는 래퍼를 만들려고합니다. 테스트 응용 프로그램을 실행하려고하면 dll로드가 실패했다는 오류가 발생합니다. 이것은 CRT를 찾으려고 할 때 문제가되는 것으로 나타났습니다. CRT를 같은 디렉터리에 복사하면이 문제가 지나치지만 응용 프로그램이 C 런타임을 잘못로드했다는 오류가 발생합니다 (R6034). 네이티브 C++ 프로그램은 이러한 문제에 아무런 문제가 없습니다.P/Invoke Runtime Errors

이 DLL은 VC 2008 컴파일 - 관리되는 코드는 2010 년

DLL이 매니페스트가 컴파일되고 나는 위와 같은 결과를 작업 디렉토리로 CRT의 정확한 버전을 복사 시도 .

  1. 왜 네이티브 프로그램이 CRT를로드 할 수 있지만 관리되는 래퍼는 그것을 찾을 수 없습니다 :

    내 질문은?

  2. 어디에서 CRT로드에 관한 두 번째 오류를 해결할 수 있습니까? 이름 맹 글링, CallingConvention 등으로 인한 것일 수 있습니까?

C++ 코드 (난 단지 헤더가) :

class Foo { 
public: 
    static void startCall(std::string hostname); 
} 

C# 코드 : 지금까지 내가 당신이 원하는 경우 기능 인터페이스에서 STL을하는 것은 불가능 알고

[DllImport("mydll.dll")] 
    public static extern void startCall(string hostname); 

    public Test() 
    { 
     string hostname = ""; 
     startCall(hostname); 
    } 
+3

1. 관련된 모든 컴파일러의 버전을 지정하십시오. 2. 잘못로드 된 런타임은 일반적으로 매니 페스트 문제로 인해 발생합니다. 3. 호출 규칙 기본값이 일치하지 않습니다. 관리되는 Stdcall, 원시의 cdecl. 4. C++ 코드도 함께 표시하십시오. –

+2

VS2010 이전의 Visual Studio 버전에서는 Windows Side-by-Side 캐시에 CRT의 DLL 버전을 배포해야합니다. 프로그래머가 사용자 대신 문제를 처리하도록하기위한 DLL 지옥의 대응책입니다. 프로그래머가 그것을 좋아하지 않는다는 것이 밝혀졌습니다. 따라서 VS2010에서는 다시 사용자 문제입니다. 대상 컴퓨터에 CRT의 적절한 버전을 배포하십시오. –

+0

다른 호출 규칙으로 인해 실제로 초기화 오류가 발생합니까? – AdamC

답변

0

C#에서 함수를 사용합니다.

C++ 라이브러리 인터페이스를 변경할 수있는 경우 문자열 대신 char *을 사용하도록 변경하십시오. char *로 인터페이스를 공개하고이를 std :: string으로 변환 한 후 std :: string 함수가있는 C++ 라이브러리를 호출하는 프록시 라이브러리를 작성할 수없는 경우