我有其与思科服务器(UCCX)连通的umanaged C ++ DLL。
它发送和接收信息,并从其通过TCP / IP此服务器。 现在也有一些类型的接收哪些消息的包含它需要发送到C#GUI这将在屏幕上显示这些参数的一些参数。
请告诉我一个有效的方法来从这个DLL引发C#的事件。
我有其与思科服务器(UCCX)连通的umanaged 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 ...