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

时间:2010-12-15 21:58:28

标签: c# c++ mfc event-listener

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

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

谢谢。

3 个答案:

答案 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