我想知道如何在C ++代码中接收并处理从C#代码引发的事件。
我有一个C#WinForms UI模块,在收集一些信息后会引发一个事件。我必须在C ++代码中处理事件,因为这是处理收集的信息的代码已经实现的地方。我只需要能够捕获事件的代码,并提取与之相关的信息。我在VS2010工作,C ++代码是一个MFC应用程序,以防有用的信息。
谢谢。
答案 0 :(得分:2)
检查委托/函数指针互操作。 http://msdn.microsoft.com/en-us/library/367eeye0(v=VS.100).aspx
您还可以将C#委托附加到事件中,并让C#代码通过P / Invoke调用C ++代码。
答案 1 :(得分:1)
您可能希望在从C#到C ++的过程中通过C ++ / CLI。
您可以编写一个C ++ / CLI包装器,它将在托管方法中直接调用非托管C ++代码。在C ++ / CLI托管方法中处理任何转换(例如,数据类型,System.String到char *)。在C#中,C ++ / CLI代码将像任何其他外部程序集一样显示,在任何需要的地方调用它。
我认为问题的一部分正是C#Winforms项目与C ++ MFC项目的关系。如果C ++代码是一个简单的处理库,那么C ++ / CLI包装器听起来对我来说是正确的。如果C ++应用程序是主要的,并且它正在加载C#项目来收集这些信息,那么其他一些东西可能会更好。
答案 2 :(得分:0)
我启动了一个我认识的项目,将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