【问题标题】:Triggering event in C# from C++ DLL从 C++ DLL 在 C# 中触发事件
【发布时间】:2012-09-25 05:56:12
【问题描述】:

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

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

请告诉我在 C# 中从此 DLL 触发事件的有效方法。

【问题讨论】:

    标签: c# c++ events pinvoke


    【解决方案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 ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-28
      相关资源
      最近更新 更多