如何编写 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++ 函数时,为啥会引发 AccessViolationException?