タイトルが説明しています。私はC++/CLIラッパーを作成しているネイティブのC++ DLLを持っていますが、これはC#で参照としてインポートされます。ネイティブC++用のC++/CLIラッパーをC#のリファレンスとして使用する
問題は、C#ではラッパー(DLLからインポートされたクラス)にあるクラスが表示されないことです。
ネイティブのC++オブジェクトをC#で表示可能にするために、どのようなキーワードを使用する必要がありますか?
タイトルが説明しています。私はC++/CLIラッパーを作成しているネイティブのC++ DLLを持っていますが、これはC#で参照としてインポートされます。ネイティブC++用のC++/CLIラッパーをC#のリファレンスとして使用する
問題は、C#ではラッパー(DLLからインポートされたクラス)にあるクラスが表示されないことです。
ネイティブのC++オブジェクトをC#で表示可能にするために、どのようなキーワードを使用する必要がありますか?
チュートリアル。 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。
私はdllで挑戦されているエラーは見つかりませんが、とにかく、あなたの方法は動作します。本当にありがとう! – Haix64
私はこの命令に従いましたが、そのようなエラーを受け取ります "usingステートメントで使用された型は暗黙的に 'System.IDisposable'に変換可能でなければなりません" – javapowered
4)からメモリリークを避けるために、finalizer!NativeClassWrapperこれはガベージコレクタによって呼び出されます – VladL
ラッパークラスは公開されていますか?宣言は "public ref class {...}"でなければなりません。 – Asik
私はそれを知っています。私が尋ねることは、そういうことが可能であるということです。 'public ref class wrapper_class = native_class;'?そのようなアプローチは可能ですか? – Haix64
それはそれほど簡単ではありません。ラッパークラスは、native_classオブジェクトをホストし、公開するnative_classのすべてのメソッドのラッパーメソッドを作成します。ラッパーメソッドは、パラメータをマーシャリングして呼び出しをnative_classオブジェクトに委譲します。 – Asik