1

ここに私のアンマネージコードがあります:

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) クラスに格納します。
  • アンマネージド クラスに渡すマネージド クラスのアドレスを取得します。(そのため、メンバー関数ポインターを使用できます。)
  • 他の何か?

何か案は?

4

0 に答える 0