簡體   English   中英

互操作 C++ 到 C#,將回調傳遞給 C++ 函數

[英]Interop C++ to C#, passing callback to c++ functions

我正在嘗試在 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);

您將無法通過 C# 代碼解決此問題。 您需要提供 C++ 類的實現。 而且你不能在 C# 中制作其中之一。

解決這個問題的唯一方法是使用 C++ 代碼。 我可以看到幾個明顯的解決方案:

  1. 使用混合模式 C++/CLI 程序集。 這可以實現非托管 C++ 類並在非托管 C++ 代碼和托管 C# 代碼之間架起一座橋梁。
  2. 在您的 C++ 代碼中添加IMessageReceiver的具體實現,它通過轉發到函數指針來實現OnMessage 函數指針可以由 C# 代碼提供。 您需要將其包裝在 C 風格的函數中,以便您可以 p/invoke 它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM