Frage

Jede Idee, wie .NET Delegaten zu initialisieren, die von ‚gemischten‘ Klasseninstanz Methode verweist?

Ich habe 'gemischte' C ++ Klasse wie folgt:

class CppMixClass
{
public:
    CppMixClass(void){
        dotNETclass->StateChanged += gcnew DotNetClass::ServiceStateEventHandler(&UpdateHealthState);
    }
   ~CppMixClass(void);
   void UpdateState(System::Object^ sender, DotNetClass::StateEventArgs^ e){
       //doSmth
   }
}

DotNetClass ist in C # implementiert und Methodendeklaration ist OK mit Delegierten. Diese Zeile erzeugt Fehler:

dotNETclass->StateChanged += gcnew DotNetClass::ServiceStateEventHandler(&UpdateHealthState);
error C2276: '&' : illegal operation on bound member function expression

Wer eine Ahnung über ein Problem haben? Vielleicht Coz CppMixClass Klasse ist keine reine .NET (ref) Klasse?

habe ich dies funktioniert, wenn UpdateHealthState statische Methode ist, aber ich muss Instanzmethode Zeiger.

Ich habe versucht, smth wie:

dotNETclass->StateChanged += gcnew DotNetClass::ServiceStateEventHandler(this, &UpdateHealthState);

Aber dies offensichtlich nicht Coz dies funktioniert nicht Zeiger (Handle) auf .NET (ref) Klasse (System :: Object).

ServiceStateEventHandler ist definiert in C # als:

public delegate void ServiceStateEventHandler(object sender, ServiceStateEventArgs e);

Danke für das Lesen dieses:)

War es hilfreich?

Lösung

ich Antwort auf diese Frage nur aus (natürlich von Nishant Sivakumar, Mann scheint Antworten zu haben, um all meine C ++ / CLI Interop Probleme im Zusammenhang mit):

http://www.codeproject.com/KB/mcpp /CppCliSupportLib.aspx?display=Print

Die Antwort ist in "msclr / event.h" Header entfernt, wo Makros für die Teilnehmer in nativen Klassen definiert sind.

Nish Code ist folgende:

class Demo5
{
msclr::auto_gcroot<FileSystemWatcher^> m_fsw;
public:
// Step (1)
// Declare the delegate map where you map
// native method to specific event handlers

BEGIN_DELEGATE_MAP(Demo5)
    EVENT_DELEGATE_ENTRY(OnRenamed, Object^, RenamedEventArgs^)
END_DELEGATE_MAP()

Demo5()
{
    m_fsw = gcnew  FileSystemWatcher("d:\\tmp");
    // Step (2)
    // Setup event handlers using MAKE_DELEGATE
    m_fsw->Renamed += MAKE_DELEGATE(RenamedEventHandler, OnRenamed);
    m_fsw->EnableRaisingEvents = true;
}
// Step (3)
// Implement the event handler method

void OnRenamed(Object^, RenamedEventArgs^ e)
{
    Console::WriteLine("{0} -> {1}",e->OldName, e->Name);
}
};

Andere Tipps

Es kann nur .NET-Typen Ereignisse verwenden. Ich schlage vor, eine neue verwaltete Klasse erstellen, die das Ereignis behandelt, und komponieren die Klasse innerhalb CppMixClass, und es einen Zeiger auf CppMixClass während der Bauphase übergeben. Ihr verwaltetes Event-Handling-Klasse kann dann eine Funktion auf CppMixClass aufrufen, wenn es ein Ereignis behandelt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top