Domanda

Qualche idea su come inizializzare un delegato .NET che punti al metodo dall'istanza di classe "mista"?

Ho una classe C ++ 'mista' come questa:

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

DotNetClass è implementato in C # e la dichiarazione del metodo è OK con delegato. Questa riga genera un errore:

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

Qualcuno ha la minima idea di un problema? Forse la classe CppMixClass coz non è una pura classe .NET (ref)?

Ho funzionato quando UpdateHealthState è un metodo statico, ma ho bisogno del puntatore al metodo dell'istanza.

Ho provato smth come:

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

Ma questo ovviamente non funziona perché non si tratta di un puntatore (handle) alla classe .NET (ref), (System :: Object).

ServiceStateEventHandler è definito in C # come:

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

Grazie per aver letto questo :)

È stato utile?

Soluzione

Ho appena trovato una risposta a questo (ovviamente di Nishant Sivakumar, l'uomo sembra avere le risposte a tutti i miei problemi relativi all'interoperabilità C ++ / CLI):

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

La risposta si trova in " msclr / event.h " header, dove sono definite le macro per i delegati nelle classi native.

Il codice di Nish è il seguente:

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);
}
};

Altri suggerimenti

Solo i tipi .NET possono utilizzare gli eventi. Suggerisco di creare una nuova classe gestita che gestisce l'evento, comporre quella classe in CppMixClass e passargli un puntatore a CppMixClass durante la costruzione. La classe di gestione degli eventi gestiti può quindi chiamare una funzione su CppMixClass quando gestisce un evento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top