如何在托管 C++ 中将委托传递给需要托管函数指针的委托

发布于 2024-12-11 22:27:31 字数 1039 浏览 0 评论 0原文

我有以下调用:

ExecutionContext::Run(item->Context, gcnew ContextCallback(item, &WaitQueueItem::Callback), item->State);

其中 WaitQueueItem 如下:

ref class WaitQueueItem
{
public:
    WaitQueueItem(){}

    WaitCallback^ Callback;
    Object^ State;
    ExecutionContext^ Context;
};

WaitCallback中定义为 public delegate void WaitCallback(Object^ state) >System::Threading 命名空间。

编译出现以下错误:

错误 C2843: 'Foo::Bar::Data::ContainingClass::WaitQueueItem::Callback':不能 获取托管的非静态数据成员或方法的地址 类型

如果我提供一个与 WaitCallback 委托具有相同签名的函数,它将进行编译。深入研究 dotPeek,我发现用 C# 编写的相同代码

ExecutionContext.Run(item.Context, new ContextCallback(item.Callback), item.State);

如下所示:

ExecutionContext.Run(item.Context, new ContextCallback(item.Callback.Invoke), item.State);

是否有一种方法无需编写包装函数即可传递委托?

提前致谢

I have the following call:

ExecutionContext::Run(item->Context, gcnew ContextCallback(item, &WaitQueueItem::Callback), item->State);

where WaitQueueItem is the following:

ref class WaitQueueItem
{
public:
    WaitQueueItem(){}

    WaitCallback^ Callback;
    Object^ State;
    ExecutionContext^ Context;
};

WaitCallback is defined as public delegate void WaitCallback(Object^ state) in the System::Threading namespace.

Compilation renders the following error:

error C2843:
'Foo::Bar::Data::ContainingClass::WaitQueueItem::Callback' : cannot
take the address of a non-static data member or method of a managed
type

If I provide a function with the same signature as the WaitCallback delegate it will compile. Digging in with dotPeek, I see that the same code when written in C#

ExecutionContext.Run(item.Context, new ContextCallback(item.Callback), item.State);

looks like this:

ExecutionContext.Run(item.Context, new ContextCallback(item.Callback.Invoke), item.State);

Is there a way to pass the delegate without having to write a wrapper function?

Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

娜些时光,永不杰束 2024-12-18 22:27:31

也许您想要

gcnew ContextCallback(item->Callback, &WaitCallback::Invoke)

(这相当于 C# 编译器所做的,绑定对象实例 item->Callback 及其 Invoke 方法)

Perhaps you want

gcnew ContextCallback(item->Callback, &WaitCallback::Invoke)

(which is equivalent to what the C# compiler did, binding the object instance item->Callback and its Invoke method)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文