从 C++ DLL 在 C# 中触发事件
Posted
技术标签:
【中文标题】从 C++ DLL 在 C# 中触发事件【英文标题】:Triggering event in C# from C++ DLL 【发布时间】:2012-09-25 05:56:12 【问题描述】:我有一个与 Cisco 服务器 (UCCX) 通信的非托管 C++ DLL。
它通过 TCP/IP 向该服务器发送和接收消息。现在它接收到一些类型的消息,其中包含一些需要发送到 C# GUI 的参数,C# GUI 将在屏幕上显示这些参数。
请告诉我在 C# 中从此 DLL 触发事件的有效方法。
【问题讨论】:
【参考方案1】: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++ 函数 MyUnManagedAPI 应该有一个 void 返回类型以匹配其 C# 对应项。【参考方案2】:注意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 ...
【讨论】:
以上是关于从 C++ DLL 在 C# 中触发事件的主要内容,如果未能解决你的问题,请参考以下文章
从 C# 调用 Advapi32.dll 本机 EventWrite 函数?
当控件即将失去焦点时,是不是存在从 C++ 程序触发的事件?
在 VBA 中使用 UnmanagedExports 包 [DllExport] 调用 C# DLL 触发“找不到 DLL 入口点”错误