Interop C ++ to C#,将回调传递给c ++函数

时间:2014-03-25 14:02:51

标签: c# c++ interop c++-cli pinvoke

我试图在C#中使用DllImport使用本机dll。大多数方法都运行正常但我仍然在注册回调。这是样本: -

  1. 用于回调的功能是static int SetReceiver(IMessageReceiver* pReceiver);
  2. IMessageReceiver的定义是

    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#中实现相同目标。我所做的是创建一个接口IMessageReceiver并在课堂上实现。我正在创建该类的对象并将其作为参数传递但是获得异常。

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

1 个答案:

答案 0 :(得分:0)

您无法从C#代码中解决此问题。您需要提供C ++类的实现。你不能用C#制作其中一个。

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

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