Observer pattern in c++/cli for mixed managed/unmanaged

和自甴很熟 提交于 2019-12-12 02:24:33

问题


I have a system comprising a C# UI, a C++/CLI mixed mode interop wrapper, and some native c++ projects.

What I need to do is set up a system such that the native c++ code can send a log message, and the UI can report it.

I set up a native IObservable using this as a template, but then the C# code can't be an observer. My thought was to set up another observer pattern in C++/CLI, which observes the native observer, and to let the C# implement that. I used this as a template but I'm struggling to convert this into valid C++/CLI.

ref class Observable
{
public:
Observable(void);
virtual ~Observable(void);

event System::EventHandler^ SomethingHappened;

void DoSomething() {
    System::EventHandler^ handler = SomethingHappened;
    //if (handler != nullptr)
    //{
        handler(this, System::EventArgs::Empty);
    //}//null check not permitted in C++/CLI
};

Gives the error: C3918: requires SomethingHappened to be a data member. This is the MSDN page - but I can't identify what I'm doing wrong.

Any suggestions?

Thanks, Melanie


回答1:


You are trying to use C# syntax. Events work a little differently in C++/CLI, they have a raise accessor in addition to the add and remove accessor. In other words, a method that fires the event. The compiler auto-generates one if you don't provide your explicit version it. That makes raising the event very simple:

void DoSomething() {
    SomethingHappened(this, System::EventArgs::Empty);
}



回答2:


In C++/Cli, you do not need to check the event for null (and you can't) when using "trivial events". The language takes care of that for you.

See related: Error C3918: Error wile checking event for being nullptr Does C++/CLI event have any listeners?

So, for your case, just remove the nullptr check




回答3:


Using this, the right thing to do is to fire the event directly. Like this:

void DoSomething() {       
    SomethingHappened(this, System::EventArgs::Empty);
}


来源:https://stackoverflow.com/questions/15779209/observer-pattern-in-c-cli-for-mixed-managed-unmanaged

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!