2012-04-17 4 views
1

그룹의 새 C# 프로그램에서 사용해야하는 기본 C++ DLL이 있습니다. C++에서 가져오고 컴파일 할 수 있도록 네이티브 C++ DLL에 대한 C++/CLI 래퍼를 만들고 싶습니다.C++ 네이티브 dll 용 C++/CLI 래퍼

내가 알아야 할 것은 래퍼 원본 파일에서 dll 파일을 처음으로로드하는 방법입니다. #using < ...>와 정확히 똑같은 일이 MSIL을위한 것이지만 네이티브 C++ dll을로드하는 것입니다.

또한 dll 내의 개체와 네임 스페이스는 어떻게 (자연스럽게) 액세스 할 수 있습니까?

편집 :이 같은

내가

class __declspec(dllexport) radar 
{ 
    // declarations and definitions 
    ... 
}; 

내 radar.dll에서 내 레이더 클래스를 수출하고, VC에서 가져와야하는 데 사용하는 ++ (CLI) 프로그램 : __declspec(dllimport) public class radar; 않도록 그것의 정의를 C#으로 수행하는 것은 확실하지만, C#에서 레이더를 볼 수 없다. 왜냐하면 VC++ (CLI)에서는 공개되지 않았기 때문이다. 내가 radar pos1();처럼, VC++ DLL의 코드에서 네이티브 DLL의 개체를 사용 싶은 경우에도 내가 얻을 :

error C2512: 'radar' : no appropriate default constructor available

방법이 작업을 수행 할 수 손에 그냥 레이더 선언을 가지는?

끝 편집.

고맙습니다!

+0

왜 C++/CLI 래퍼를 만들어야합니까? C#에서 PInvoke를 사용하여 기본 DLL을 호출하지 않는 이유가 있습니까? http://msdn.microsoft.com/en-us/library/aa446536.aspx – PeskyGnat

답변

3

자동입니다. 직접하지 마세요. C++/CLI 프로젝트, 추가 종속성 설정에 대한 링커 설정에서 기본 DLL 가져 오기 라이브러리 (.lib)를 지정합니다. 링커는 DLL 이름에 대한 참조를 C++/CLI 어셈블리에 연결합니다. C# 코드가 C++/CLI 어셈블리에서 관리되는 형식을 사용하는 즉시 CLR은 어셈블리를로드합니다. Windows는 DLL에서 원시 DLL 참조를 감지하여 자동으로로드합니다.

Windows가 런타임에 실제로 네이티브 DLL을 찾을 수있는 경우에만 좋은 결과를 얻을 수 있습니다. EXE 프로젝트의 빌드 폴더에 복사하십시오. 어쨌든 빌드 후 이벤트를 사용하거나 Copy to Output Directory 속성을 true로 설정하여 C# 프로젝트에 추가하여이 작업을 수행 할 수 있습니다.

+0

좋아, 내가 선호하는 방법은 현재 명시 적 연결이라고 생각합니다. 함수 액세스를 위해'LoadLibrary()'와'GetProcAddress()'를 사용하고 싶지만 DLL에 많은 클래스가 있습니다. 내 수업에 수업을 어떻게 가져 옵니까? – Haix64

+0

"많은 수업"으로 인해이 방법은 무섭게 실용적입니다. 명시 적 연결을 실현할 수 있도록 COM 서버를 작성할 수 있습니다. –

+0

따라서 지금까지 얘기 한 방법은 관리되지 않는 DLL에 관해서 이야기 할 때 거의 유일한 것입니다. 그리고이 방법을 사용하여 COM으로 써야합니까? – Haix64

관련 문제