web-dev-qa-db-ja.com

C#で参照として使用するネイティブC ++のC ++ / CLIラッパー

タイトルの説明。 C++/CLIラッパーを作成しているネイティブC++ dllがあり、C#に参照としてインポートされます。

問題は、C#ではラッパー(DLLからインポート)にあるクラスが表示されないことです。

どのキーワードを使用し、ネイティブC++オブジェクトをC#で表示されるように再宣言するにはどうすればよいですか?

30
Haix64

わかりました、チュートリアル。 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ステートメント内でラッパータイプを使用します

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

Usingステートメントにより、Dispose()が呼び出され、デストラクタがすぐに実行され、ネイティブオブジェクトが破棄されます。そうしないと、メモリリークが発生し、恐らく恐ろしく(プログラムではなく)死んでしまいます。注: Dispose()メソッドは魔法のように作成されます

66
Asik