C# 如何将非静态回调注册为C+中的函数指针+/CLI环境? 我们有一个C++/CLI类,我们称之为类A,从中我们想将非静态回调(“MyNoStistCalbCub”)登记到非托管C++类(B类)中。

C# 如何将非静态回调注册为C+中的函数指针+/CLI环境? 我们有一个C++/CLI类,我们称之为类A,从中我们想将非静态回调(“MyNoStistCalbCub”)登记到非托管C++类(B类)中。,c#,.net,events,c++-cli,C#,.net,Events,C++ Cli,e、 g 我们之所以需要非静态回调,是因为我们希望从这个回调函数引发一个C#事件 我理解不可能将实例的数据成员作为函数指针传递。在这里最好的方式是什么 谢谢并致以最良好的祝愿 Romain使用Marshal.GetFunctionPointerForDelegate方法获取传递给非托管代码的函数指针。将MyNonStaticCallback中的void*替换为IntPtr,它匹配非托管void*。通过常规C++/CLI规则创建委托实例。使用Marshal.GetFunctionPointerFo

e、 g

我们之所以需要非静态回调,是因为我们希望从这个回调函数引发一个C#事件

我理解不可能将实例的数据成员作为函数指针传递。在这里最好的方式是什么

谢谢并致以最良好的祝愿


Romain

使用Marshal.GetFunctionPointerForDelegate方法获取传递给非托管代码的函数指针。将MyNonStaticCallback中的void*替换为IntPtr,它匹配非托管void*。通过常规C++/CLI规则创建委托实例。

使用Marshal.GetFunctionPointerForDelegate方法获取传递给非托管代码的函数指针。将MyNonStaticCallback中的void*替换为IntPtr,它匹配非托管void*。使用通用C++/CLI规则创建委托实例。

它*几乎*可以工作,但我现在遇到了一个“运行时检查失败#0”,这让我认为我的函数的一个声明可能有问题。已修复。问题在于IntPtr与void*不完全相同。对,
IntPtr
有一个
void*
,没有关系。您必须在
IntPtr
上调用
ToPointer
以取出
void*
。它*几乎*起作用,但我现在遇到了一个“运行时检查失败#0”,这让我认为我的函数声明可能有问题。已修复。问题在于IntPtr与void*不完全相同。对,
IntPtr
有一个
void*
,没有关系。您必须在
IntPtr
上调用
ToPointer
,以取出
void*
void MyNonStaticCallback(void* ...)
{
    // Raise a C# event from this code
}

// Register callback into class B
myClassBInstance->RegisterCallback(..., &MyNonStaticCallback, ...);