ここに私のアンマネージコードがあります:
delegate void MyDelegate(array<int>^% arguments);
typedef void (__stdcall *MyCallback)(array<int>^% arguments);
void Test(MyDelegate^ delegate)
{
MyCallback myCallback = static_cast<MyCallback>(Marshal::GetFunctionPointerForDelegate(delegate).ToPointer());
array<int>^ foo = gcnew array<int>(5);
foo[0] = 1;
foo[1] = 2;
foo[2] = 3;
foo[3] = 4;
foo[4] = 5;
myCallback(foo);
}
結果:
デリゲートが呼び出されますが、デリゲートの引数の array.Length が 5 ではなく 1 です。配列の最初の要素は正しいです。コールバック foo.Length() の後も 1 つです! 誰でも理由を教えてもらえますか??
詳細情報:
C++/CLI を使用して C++ ライブラリをラップし、C# からアクセスできるようにしています。C++ ライブラリは、メンバー関数ポインター ( FastDelegate ) を使用して、アンマネージ "デリゲート" のタイプを実現します。最終的に ac# デリゲートを呼び出すこれらの "FastDelegate" メンバー関数ポインターの 1 つを提供する必要があります。これを達成するには、次のいずれかを行う必要があるようです。
- デリゲート参照をアンマネージ (非 ref) クラスに格納します。
- アンマネージド クラスに渡すマネージド クラスのアドレスを取得します。(そのため、メンバー関数ポインターを使用できます。)
- 他の何か?
何か案は?