这是我的非托管代码:
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”成员函数指针之一。为了实现这一点,我似乎需要执行以下操作之一:
- 将委托引用存储在非托管(非引用)类中。
- 获取托管类的地址以传递给非托管类。(这样我就可以使用指向它的成员函数指针。)
- 还有什么?
有任何想法吗?