2012-04-19 1 views
25

タイトルが説明しています。私はC++/CLIラッパーを作成しているネイティブのC++ DLLを持っていますが、これは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(); 
} 

使用ステートメントは廃棄する(保証)直ちにデストラクタを実行し、ネイティブオブジェクトを破壊する、と呼ばれています。そうしないとメモリリークが発生し、恐らく恐ろしいことになります(プログラムではない)。注:The Dispose() method is magically created for you

+0

私はdllで挑戦されているエラーは見つかりませんが、とにかく、あなたの方法は動作します。本当にありがとう! – Haix64

+0

私はこの命令に従いましたが、そのようなエラーを受け取ります "usingステートメントで使用された型は暗黙的に 'System.IDisposable'に変換可能でなければなりません" – javapowered

+1

4)からメモリリークを避けるために、finalizer!NativeClassWrapperこれはガベージコレクタによって呼び出されます – VladL

関連する問題