c++与c#的互操作,传递回调给c++函数
Interop C++ to C#, passing callback to c++ functions
我试图在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风格的函数,这样你就可以调用它了。相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在C++中实现回调
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数