2012-04-19 3 views
25

제목 설명. 나는 네이티브 C++ dll을 가지고 있는데, C++/CLI 래퍼를 쓰고 있는데, C#에서 참조로 가져올 것이다.네이티브 C++ 용 C++/CLI 래퍼가 C#의 참조로 사용됩니다.

문제는 C#에서는 래퍼 (DLL에서 가져온 클래스)가 표시되지 않는다는 것입니다.

C#에서 내 기본 C++ 객체를 다시 선언하면 어떤 키워드를 사용해야합니까?

+0

래퍼 클래스가 공개되어 있습니까? 선언은 "public ref class {...}"이어야합니다. – Asik

+0

나는 그것을 안다. 내가 묻는 것은 그것이 가능하다는 것이다. 'public ref class wrapper_class = native_class;'? 그러한 접근이 가능한가? – Haix64

+0

그렇게 간단하지 않습니다. 래퍼 클래스는 native_class 개체를 호스팅하고 노출하려는 native_class의 모든 메서드에 대한 래퍼 메서드를 만듭니다. 래퍼 메서드는 매개 변수를 마샬링하고 호출을 native_class 개체에 위임합니다. – Asik

답변

56

자, 자습서. C#에 노출하고자하는 C++ 클래스 NativeClass이 있습니다.

class NativeClass { 
public: 
    void Method(); 
}; 

1) C++/CLI 프로젝트를 만듭니다. C++ 라이브러리 및 헤더에 링크.

2) 원하는 메서드를 제공하는 래퍼 클래스를 만듭니다. 예 :

#include "NativeClass.h" 

public ref class NativeClassWrapper { 
    NativeClass* m_nativeClass; 

public: 
    NativeClassWrapper() { m_nativeClass = new NativeClass(); } 
    ~NativeClassWrapper() { this->!NativeClassWrapper(); } 
    !NativeClassWrapper() { delete m_nativeClass; } 
    void Method() { 
     m_nativeClass->Method(); 
    } 
}; 

3) C# 프로젝트에서 C++/CLI 프로젝트에 대한 참조를 추가하십시오.

4)을 사용하여 문 내에서 래퍼 타입 를 사용

using (var nativeObject = new NativeClassWrapper()) { 
    nativeObject.Method(); 
} 

using 문 바로 소멸자를 실행하고 기본 객체를 파괴하는,()를 호출 폐기를 보장합니다. 그렇지 않으면 메모리 누수가 발생하고 아마도 끔찍하게 죽을 것입니다 (프로그램이 아닙니다). 참고 : The Dispose() method is magically created for you.

+0

dll에서 오류가 발생했습니다.하지만 어쨌든 방법은 작동합니다. 정말 고마워! – Haix64

+0

이 지시를 따르지 만 그런 오류가 발생합니다 "using 문에서 사용되는 형식은 암시 적으로 'System.IDisposable'로 변환 가능해야합니다." – javapowered

+1

4)에서 메모리 누수가 발생하지 않도록하려면 finalizer! NativeClassWrapper(); 이것은 가비지 컬렉터가 호출합니다. – VladL

관련 문제