c++与c#的互操作,传递回调给c++函数
本文关键字:c++ 回调 函数 互操作 | 更新日期: 2023-09-27 17:52:57
我试图在c#中使用DllImport使用本机dll。大多数方法都工作得很好,但我被困在注册回调。下面是示例:-
- 回调函数为
static int SetReceiver(IMessageReceiver* pReceiver);
-
imessagerreceiver的定义为
class IMessageReceiver { public: virtual void OnMessage(unsigned char ucCommand, const void* pData, size_t size) = 0; };
-
在c++中是这样做的:
class A : IMessageReceiver{ implementation of virtual function} SetReceiver(this); // this is object of Class A.
-
我想在c#中实现相同的功能。我所做的是创建一个接口imessagerreceiver并在类中实现。我正在创建该类的对象并将其作为参数传递,但得到异常。
[DllImport("Native.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void SetMessageReceiver(IMessageReceiver pReceiver); SetMessageReceiver(pReceiver);
你不能从你的c#代码中解决这个问题。您需要提供一个c++类的实现。你不能在c#中创建一个。
解决这个问题的唯一方法是用c++代码。我可以看到几个明显的解决方案:
- 使用混合模式c++/CLI程序集。它可以实现非托管c++类,并提供非托管c++代码和托管c#代码之间的桥梁。 在你的c++代码中添加一个
IMessageReceiver
的具体实现,通过转发到一个函数指针来实现OnMessage
。函数指针可以由c#代码提供。你需要把它包装成一个C风格的函数,这样你就可以调用它了。