如何编写 C++ 代码来处理 C# 代码中引发的事件

Posted

技术标签:

【中文标题】如何编写 C++ 代码来处理 C# 代码中引发的事件【英文标题】:how to write C++ code to handle an event raised in C# code 【发布时间】:2010-12-15 21:58:27 【问题描述】:

我想知道如何在 C++ 代码中接收并处理从 C# 代码引发的事件。

我有一个 C# WinForms UI 模块,它在收集一些信息后引发一个事件。我必须在 C++ 代码中处理事件,因为那里已经实现了处理收集到的信息的代码。我只需要捕获事件并提取与其相关的信息的代码。我在 VS2010 中工作,C++ 代码是一个 MFC 应用程序,以防有用信息。

谢谢。

【问题讨论】:

你试过 P/Invoke 吗? 【参考方案1】:

查看委托/函数指针互操作。 http://msdn.microsoft.com/en-us/library/367eeye0(v=VS.100).aspx

您还可以将 C# 委托附加到事件,并让 C# 代码通过 P/Invoke 调用 C++ 代码。

【讨论】:

谢谢,亚伦。我想我会尝试你建议的 C# 委托 --> P/Invoke 方法,这似乎对我来说可能是最容易实现的。【参考方案2】:

在从 C# 到 C++ 的过程中,您可能希望通过 C++/CLI。

您可以编写一个 C++/CLI 包装器,该包装器将在托管方法中直接调用非托管 C++ 代码。在 C++/CLI 托管方法中处理任何转换(例如,数据类型,System.String 到 char*)。在 C# 中,该 C++/CLI 代码将像任何其他外部程序集一样显示,在您需要的任何地方调用它。

我认为部分问题在于 C# Winforms 项目与 C++ MFC 项目的关系。如果 C++ 代码是一个简单的处理库,那么 C++/CLI 包装器对我来说听起来是正确的。如果 C++ 应用程序是主要应用程序,并且它正在加载 C# 项目以收集该信息,那么其他方式可能会更好。

【讨论】:

C++ 应用程序是主要的。信息收集 UI 可以用 MFC 编写,但 C# Winforms 更容易编写相当复杂的 GUI,看起来值得互操作的麻烦。【参考方案3】:

我提出了一个我知道将 C# 和 C++ 与事件混合的项目,但我拥有的代码实际上与您想要的相反:它从 C++ 触发 C# 委托。可能有足够多的关键字为您指明正确的方向:

    public: static void Fire(Delegate^ del, ... array<System::Object^>^ args)
    
        if (nullptr == del)
            return;

        array<Delegate^>^ delegates = del->GetInvocationList();

        for each (Delegate^ sink in delegates)
        
            try
            
                //sink->DynamicInvoke(args);
                System::Windows::Forms::Form^ f;
                f = dynamic_cast<System::Windows::Forms::Form^>(sink->Target);
                if (f) 
                    f->Invoke(sink, args);
                 else 
                    sink->DynamicInvoke(args);
                
            
            catch(Exception^ e)
            
                Trace::WriteLine("EventsHelper.Fire");
                Trace::WriteLine(e->Message);
            

         // end for each

     // end Fire

【讨论】:

以上是关于如何编写 C++ 代码来处理 C# 代码中引发的事件的主要内容,如果未能解决你的问题,请参考以下文章

g_main_loop_quit 引发 GLib-CRITICAL 错误。如何在 C++ 中处理它?

从 C# 模块调用 C++ 函数会引发随机崩溃

当我从 C# 代码调用导入的 C++ 函数时,为啥会引发 AccessViolationException?

如何编写我的 C++ 函数以便我可以从 C# 调用它?

如何有效处理 Teamcenter ITK C++ 代码中的错误 [关闭]

C++ 库问题