使用Marshal :: GetFunctionPointerForDelegate的回调更改托管数组参数

时间:2013-09-17 23:49:56

标签: c# arrays c++-cli

这是我的非托管代码:

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

更多信息:

我正在使用C ++ / CLI来包装C ++库,以便C#可以访问它。 C ++库使用成员函数指针(FastDelegate)来实现一种非托管“委托”。我需要提供其中一个“FastDelegate”成员函数指针,最终调用一个c#委托。为实现这一目标,我似乎需要做以下其中一项:

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

有什么想法吗?

0 个答案:

没有答案