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 是一而不是五。数组中的第一个元素是正确的。回调后 foo.Length() 也是一个!谁能告诉我为什么??

更多信息:

我正在使用 C++/CLI 来包装 C++ 库,以便 C# 可以访问它。C++ 库使用成员函数指针 ( FastDelegate ) 来实现一种非托管“委托”。我需要提供最终调用 ac# 委托的“FastDelegate”成员函数指针之一。为了实现这一点,我似乎需要执行以下操作之一:

  • 将委托引用存储在非托管(非引用)类中。
  • 获取托管类的地址以传递给非托管类。(这样我就可以使用指向它的成员函数指针。)
  • 还有什么?

有任何想法吗?

4

0 回答 0