C++ cli 如何将委托传递给需要托管C+中托管函数指针的委托+;
我有以下电话:C++ cli 如何将委托传递给需要托管C+中托管函数指针的委托+;,c++-cli,C++ Cli,我有以下电话: ExecutionContext::Run(item->Context, gcnew ContextCallback(item, &WaitQueueItem::Callback), item->State); 其中WaitQueueItem如下所示: ref class WaitQueueItem { public: WaitQueueItem(){} WaitCallback^ Callback; Object^ State;
ExecutionContext::Run(item->Context, gcnew ContextCallback(item, &WaitQueueItem::Callback), item->State);
其中WaitQueueItem
如下所示:
ref class WaitQueueItem
{
public:
WaitQueueItem(){}
WaitCallback^ Callback;
Object^ State;
ExecutionContext^ Context;
};
WaitCallback
定义为System::Threading
命名空间中的公共委托void WaitCallback(对象^state)
编译会导致以下错误:
错误C2843:
'Foo::Bar::Data::ContainingClass::WaitQueueItem::Callback':无法
获取托管服务器的非静态数据成员或方法的地址
类型
如果我提供一个与WaitCallback
委托具有相同签名的函数,它将编译。深入研究dotPeek,我发现用C#编写的代码是相同的
看起来像这样:
ExecutionContext.Run(item.Context, new ContextCallback(item.Callback.Invoke), item.State);
有没有一种方法可以在不必编写包装函数的情况下传递委托
提前谢谢也许你想要
gcnew ContextCallback(item->Callback, &WaitCallback::Invoke)
(这相当于C编译器所做的,绑定对象实例item->Callback
及其Invoke
方法)也许您想要
gcnew ContextCallback(item->Callback, &WaitCallback::Invoke)
(这相当于C#编译器所做的,绑定对象实例
item->Callback
及其Invoke
方法)必须在委托构造函数中传递方法的地址,而不是委托的地址。委托类型ContextCallback与WaitCallback不匹配。愚蠢的问题,因为他们有相同的签名。如果不想将回调成员声明为ContextCallback类型,则需要一个简单调用回调委托的小助手方法。这就是我所做的,但我希望在给定匹配签名的情况下找到一个“更好”的解决方案。给定相同的签名,我可以做以下操作:code
item->Callback=reinterpret\u cast(Callback);必须在委托构造函数中传递方法的地址,而不是委托的地址。委托类型ContextCallback与WaitCallback不匹配。愚蠢的问题,因为他们有相同的签名。如果不想将回调成员声明为ContextCallback类型,则需要一个简单调用回调委托的小助手方法。这就是我所做的,但我希望在给定匹配签名的情况下找到一个“更好”的解决方案。给定相同的签名,我可以做以下操作:code
item->Callback=reinterpret\u cast(Callback);