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);