Embedded Mono: Wie hebst du ein Event in C ++?

8

Ich arbeite an einer Anwendung, die Mono einbettet, und ich möchte ein Ereignis von der C ++ - Schicht in die C # -Schicht auslösen. Folgendes habe ich:

%Vor%

RaiseMethod kommt jedoch immer als NULL zurück. Betrachtet man die Struktur des MonoEvent, sieht es so aus, als wären die add- und remove-Methoden gefüllt, aber nicht die Erhöhung? Gibt es etwas Besonderes, was ich tun muss, um das zu erreichen?

BEARBEITEN: Wenn es darauf ankommt, ist hier die (grundlegende) Form des Delegaten, der Klasse und der Ereignisse, die ich in der C # -Schicht verwende.

%Vor%     
Jeff 31.01.2012, 22:42
quelle

2 Antworten

5

Kann das Ereignis in der Elternklasse definiert werden? Wenn dies der Fall ist, müssen Sie die Klassenhierarchie mit folgendem Befehl durchlaufen:

%Vor%

BEARBEITEN nach Kommentar und erneutem Lesen der Frage :

Es ist normal, dass die Methode "raise" für das Ereignis NULL ist.

  

Diese Methode gibt normalerweise null für Ereignisse zurück, die mit dem C # -Ereignisschlüsselwort oder dem Visual Basic-Ereignisschlüsselwort deklariert wurden. Dies liegt daran, dass die C # - und Visual Basic-Compiler standardmäßig keine solche Methode generieren.

( Quelle )

Ich fürchte, es kann schwierig sein, ein Ereignis einer Klasse zu feuern. Weil es tatsächlich das Konzept von Ereignissen in .NET bricht - was besagt, dass die Klasse selbst nur ihr eigenes Ereignis auslösen kann. Tatsächlich ist es selbst von C # schwierig, das Ereignis einer anderen Klasse zu erhöhen.

Vom Konzept her sind Ereignisse ein Paar von Methoden add_handler und remove_handler, in denen Sie Delegaten angeben, die aufgerufen werden sollen, wenn die Umstände eines Ereignisses eintreten. Es ist Aufgabe der Klasse, wie sie Ereignisse implementiert. Technisch ist es nur ein privates Delegiertenfeld, AFAIK. Sie können versuchen, es zu lokalisieren.

Ich bin nicht sicher, ob es ein richtiger Ansatz ist, aber eine der Antworten in Wie erhebe ich ein Ereignis durch Reflektion in .NET / C #? beschreibt, wie Ereignisse mithilfe von Reflektion ausgelöst werden. Sie könnten versuchen, sie in mono_class / mono_field-Aufrufe usw. zu konvertieren.

    
Krizz 31.01.2012, 22:49
quelle
3

Krizzs Antwort ist die vollständigste. So habe ich meinen Code so korrigiert, dass ich "erwarten" würde.

Ich habe die C # -Seite in:

geändert %Vor%

Dann packte die Monomethode mit

%Vor%     
Jeff 31.01.2012 23:28
quelle

Tags und Links