c++与c#的互操作,传递回调给c++函数

本文关键字:c++ 回调 函数 互操作 | 更新日期: 2023-09-27 17:52:57

我试图在c#中使用DllImport使用本机dll。大多数方法都工作得很好,但我被困在注册回调。下面是示例:-

  1. 回调函数为static int SetReceiver(IMessageReceiver* pReceiver);
  2. imessagerreceiver的定义为

    class IMessageReceiver
    {
    public:
       virtual void OnMessage(unsigned char ucCommand, const void* pData, size_t size) = 0;
    };
    
  3. 在c++中是这样做的:

    class A : IMessageReceiver{ implementation of virtual function}
    SetReceiver(this); // this is object of Class A.
    
  4. 我想在c#中实现相同的功能。我所做的是创建一个接口imessagerreceiver并在类中实现。我正在创建该类的对象并将其作为参数传递,但得到异常。

    [DllImport("Native.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void SetMessageReceiver(IMessageReceiver pReceiver);
    SetMessageReceiver(pReceiver); 
    

c++与c#的互操作,传递回调给c++函数

你不能从你的c#代码中解决这个问题。您需要提供一个c++类的实现。你不能在c#中创建一个。

解决这个问题的唯一方法是用c++代码。我可以看到几个明显的解决方案:

  1. 使用混合模式c++/CLI程序集。它可以实现非托管c++类,并提供非托管c++代码和托管c#代码之间的桥梁。
  2. 在你的c++代码中添加一个IMessageReceiver的具体实现,通过转发到一个函数指针来实现OnMessage。函数指针可以由c#代码提供。你需要把它包装成一个C风格的函数,这样你就可以调用它了。