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

时间:2012-09-25 05:56:12

标签: c# c++ events pinvoke

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

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

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

2 个答案:

答案 0 :(得分:8)

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#side

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

答案 1 :(得分:0)

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