2009-01-08 8 views
4

Une idée de comment initialiser le délégué .NET qui pointe vers la méthode de l'instance de classe 'mixte'?Est-il possible que la classe native utilise l'événement .NET?

je classe 'mixte' C++ comme ceci:

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

DotNetClass est implémenté en C#, et la déclaration Méthode est OK avec délégué. Cette ligne génère l'erreur:

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

Quelqu'un a un indice d'un problème? Peut-être que la classe CppMixClass n'est pas une pure classe .NET (ref)?

J'ai obtenu ce qui fonctionne lorsque UpdateHealthState est une méthode statique, mais j'ai besoin d'un pointeur vers la méthode d'instance.

J'ai essayé smth comme:

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

Mais cela ne fonctionne évidemment pas coz ce pointeur est pas (poignée) à la classe .NET (ref), (System :: Object).

ServiceStateEventHandler est défini en C# comme:

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

Thanx pour la lecture de ce :)

Répondre

5

Je viens de trouver réponse à cette question (bien sûr par Nishant Sivakumar, l'homme semble avoir des réponses à toutes mes C++/CLI problèmes Interop connexes):

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

réponse se trouve dans « msclr/événement .h "header, où les macros pour les délégués dans les classes natives sont définies.

code de Nish est le suivant:

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

Nice - merci pour l'affichage - je ne savais pas que –

3

Seuls les types .NET peuvent utiliser des événements. Je suggère de créer une nouvelle classe managée qui gère l'événement, et de composer cette classe dans CppMixClass, et lui passer un pointeur vers CppMixClass pendant la construction. Votre classe de gestion d'événements gérés peut ensuite appeler une fonction sur CppMixClass lorsqu'elle gère un événement.

Questions connexes