7

我有一个与 Cisco 服务器 (UCCX) 通信的非托管 C++ DLL。

它通过 TCP/IP 向该服务器发送和接收消息。现在它接收到一些类型的消息,其中包含一些需要发送到 C# GUI 的参数,C# GUI 将在屏幕上显示这些参数。

请告诉我从这个 DLL 触发 C# 事件的有效方法。

4

2 回答 2

10

http://blogs.msdn.com/b/davidnotario/archive/2006/01/13/512436.aspx似乎回答了你的问题。您在 C# 端使用委托,在 C++ 端使用标准回调。

C++ 方面:

typedef void (__stdcall *PFN_MYCALLBACK)();
int __stdcall MyUnmanagedApi(PFN_ MYCALLBACK callback);

C#端

public delegate void MyCallback();
[DllImport("MYDLL.DLL")] public static extern void MyUnmanagedApi(MyCallback callback);

public static void Main()
{
  MyUnmanagedApi(
    delegate()
    {
      Console.WriteLine("Called back by unmanaged side");
    }
   );
}
于 2012-09-25T05:59:44.303 回答
1

注意 C++ 端应该是

typedef void (__stdcall *PFN_MYCALLBACK)();
extern "C" __declspec(dllexport) void __stdcall MyUnmanagedApi(PFN_ MYCALLBACK callback);

另一种选择是在 C++ 端删除 __stdcall

typedef void (*PFN_MYCALLBACK)();
extern "C" __declspec(dllexport) void MyUnmanagedApi(PFN_ MYCALLBACK callback);

在 C# 方面:

public delegate void MyCallback();
[DllImport("MYDLL.DLL", CallingConvention = CallingConvention.Cdecl))] 
public static extern void MyUnmanagedApi(MyCallback callback);

as above ...
于 2018-01-12T06:02:43.020 回答