2010-12-15 134 views
2

Je voudrais savoir comment, dans le code C++, puis-je recevoir et gérer les événements soulevés à partir du code C#.comment écrire du code C++ pour gérer un événement élevé dans le code C#

J'ai un module d'interface C# WinForms qui déclenche un événement après la collecte des informations. Je dois gérer l'événement en code C++, car c'est là que le code pour traiter les informations collectées est déjà implémenté. J'ai juste besoin du code qui va attraper l'événement, et extraire les informations qui y sont associées. Je travaille dans VS2010, et le code C++ est une application MFC, au cas où c'est une information utile.

Merci.

+0

Avez-vous essayé P/Invoke? –

Répondre

2

Extraction du pointeur de délégué/fonction. http://msdn.microsoft.com/en-us/library/367eeye0(v=VS.100).aspx

Vous pouvez également joindre un délégué C# à l'événement et avoir le code C# appeler le code C++ via P/Invoke.

+0

Merci, Aaron. Je pense que je vais essayer le délégué C# -> P/Invoke approche que vous suggérez, qui semble être le plus facile à mettre en œuvre. – Andrew

1

Vous voudrez peut-être passer par C++/CLI sur votre chemin de C# à C++.

Vous pouvez écrire un C++/CLI wrapper qui, dans une méthode gérée, appelez le code C++ non géré directement. Gérez les conversions (types de données, System.String en char *, par exemple) dans la méthode gérée C++/CLI. En C#, ce code C++/CLI s'affichera comme n'importe quel autre assembly externe, appelez-le où vous le souhaitez.

Je pense qu'une partie de la question est exactement comment le projet C# Winforms concerne le projet C++ MFC. Si le code C++ est une simple bibliothèque de traitement, alors un wrapper C++/CLI me semble correct. Si l'application C++ est la principale, et qu'elle charge le projet C# pour collecter cette information, alors quelque chose d'autre peut être meilleur.

+0

L'application C++ est le principal. L'interface utilisateur de collecte d'informations aurait pu être écrite en MFC, mais C# Winforms est tellement plus facile d'écrire une interface graphique assez complexe, cela semble valoir la peine d'interopérabilité. – Andrew

0

Je tirai un projet, je savais mélanger C# et C++ avec des événements, mais le code est en fait je l'envers de ce que vous voulez: Il tire C# délégués de C++. Il pourrait y avoir assez de mots-clés pour vous diriger dans la bonne direction:

public: static void Fire(Delegate^ del, ... array<System::Object^>^ args) 
    { 
     if (nullptr == del) 
      return; 

     array<Delegate^>^ delegates = del->GetInvocationList(); 

     for each (Delegate^ sink in delegates) 
     { 
      try 
      { 
       //sink->DynamicInvoke(args); 
       System::Windows::Forms::Form^ f; 
       f = dynamic_cast<System::Windows::Forms::Form^>(sink->Target); 
       if (f) { 
        f->Invoke(sink, args); 
       } else { 
        sink->DynamicInvoke(args); 
       } 
      } 
      catch(Exception^ e) 
      { 
       Trace::WriteLine("EventsHelper.Fire"); 
       Trace::WriteLine(e->Message); 
      } 

     } // end for each 

    } // end Fire