2016-06-30 10 views
0

Ich versuche, einen Ereignis-Aggregator in C++/CLI zu erstellen, weiß ich, dass die gültige Syntax in C# wäre wie folgt:einen Prism PubSub Artereignis in C++/CLI

//C# code 
public partial class Foo : UserControl, IView, IDisposable 
{ 
    private IEventAggregator _aggregator; 

    public Foo(IEventAggregator aggregator) 
    { 
     InitializeComponent(); 

     this._aggregator = aggregator; 
     if (this._aggregator == null) 
      throw new Exception("null pointer"); 

     _subToken =_aggregator.GetEvent<fooEvent>().Subscribe(Handler, ThreadOption.UIThread, false); 
    } 

    private SubscriptionToken _subToken = null; 

    private void Handler(fooEventPayload args) 
    { 
     //this gets run on the event 
    } 
} 
direkt

jedoch Umwandlung dies zu C++/CLI gibt den Fehler "ein Zeiger zu Mitglied ist nicht gültig für eine verwaltete Klasse" in der angegebenen Zeile. Gibt es eine Problemumgehung? Ich denke, es hat etwas damit zu tun, wie C# "Action" generiert.

//C++/CLI code 
ref class Foo 
{ 
public: 
    Foo(IEventAggregator^ aggregator) 
    { 
     void InitializeComponent(); 

     this->_aggregator = aggregator; 
     if (this->_aggregator == nullptr) 
      throw gcnew Exception("null pointer"); 

     //error in the following line on Hander, a pointer-to-member is not valid for a managed class 
     _subToken = _aggregator->GetEvent<fooEvent^>()->Subscribe(Handler, ThreadOption::UIThread, false); 
private: 
    IEventAggregator^_aggregator; 
    SubscriptionToken^_addActorPipelineToken = nullptr; 

    void Handler(fooEventPayload^ args) 
    { 
     //this gets run on the event 
    } 
} 

Antwort

1

Sie müssen das Delegate-Objekt explizit instanziieren, anstatt zuzulassen, dass C# dies für Sie erledigt.

_subToken = _aggregator->GetEvent<fooEvent^>()->Subscribe(
    gcnew Action<fooEventPayload^>(this, &Foo::Handler), ThreadOption::UIThread, false); 
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^      Explicitly instantiate the delegate. 
//         ^^^^    Object to call the delegate on. 
//          ^^^^^^^^^^^^^ C++-style reference to the method.