3

ActiveX コントロール (C++ で記述) があり、C# プロジェクトから RCW アセンブリ (aximp.exe で作成) を参照しています。

Ax コントロールを実装する C++ コードには、Ax コントロールのプロパティとして公開されるインターフェイスを実装するクラスがあります。

生成された RCW アセンブリを見ると、インターフェイスが見えます。そして、その型の変数を宣言しようとすることができます。

メモリ内にインターフェイスを実装する C++ クラスのインスタンスへのポインターしかない場合、そのポインターを使用してインターフェイスを表すマネージ C# オブジェクトにそのデータをマーシャリングすることは可能ですか?

インターフェイスポインタではないことに注意してください。私が持っているクラスのインスタンスへのポインタです。

4

2 に答える 2

1

C++ / CLI を試してみてください。C++ と C# の間で相互運用するコードを書くのは簡単です。

于 2009-07-24T20:22:20.250 に答える
1

ここに2つの質問があると思います。

「this」ポインターをマネージド コードにマーシャリングできますが、特定のインターフェイスとしてマーシャリングすることはできません

はい。これは、C# アプリケーションに COM インターフェイスを実装し、パラメータの 1 つとして「this」を渡すことによって可能になります。"this" ポインターを受け入れるマネージド型は、プラットフォームに応じて Int32 または Int64 (符号なし OK) である必要があります。

このポインターで何か役に立つことはありますか

はいといいえ。

値をキャストできる型がないため、このポインターでインスタンス メソッドを直接呼び出すことはできません。そのため、COM インターフェイスのように使用することはできません。

できることは、ネイティブ アプリケーションで一連の extern "C" メソッドを定義することです。このメソッドは、その型のポインターを最初のパラメーターとして受け取り、そのオブジェクトで特定のメソッドを呼び出します。その後、C# を使用してそのメソッドに PInvoke できます

C++

void SomeType_SomeMethod(SomeType* pSomeType) {
  pSomeType->SomeMethod();
}

C#

[DllImport("YourDll.dll")]
public static extern void SomeType_SomeMethod(IntPtr pSomeType);
于 2009-07-25T01:33:50.073 に答える