从C ++ DLL中触发C#中的事件

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

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

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

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"); } ); } 

注意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 ...