web-dev-qa-db-fra.com

Possible d'appeler du code C ++ à partir de C #?

Est-il possible d'appeler du code C++, éventuellement compilé en tant que fichier de bibliothèque de code (.dll), à partir d'un langage .NET tel que C #?

Plus précisément, du code C++ tel que la bibliothèque de mise en réseau RakNet.

81
yiingchau

Un moyen simple d'appeler en C++ est de créer un assembly wrapper en C++/CLI. En C++/CLI, vous pouvez appeler du code non managé comme si vous écriviez du code natif, mais vous pouvez appeler du code C++/CLI à partir de C # comme s'il était écrit en C #. Le langage a été essentiellement conçu avec interop dans les bibliothèques existantes comme son "application tueur".

Par exemple - compilez ceci avec le commutateur/clr

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

public:
     ManagedType() : NativePtr(new NativeType()) {}
     ~ManagedType() { delete NativePtr; }

     void ManagedMethod()
      { NativePtr->NativeMethod(); } 
}; 

Ensuite, en C #, ajoutez une référence à votre assembly ManagedType et utilisez-le comme ceci:

ManagedType mt = new ManagedType();
mt.ManagedMethod();

Consultez cet article de blog pour un exemple plus expliqué.

85
Eclipse

Je ne connais pas la bibliothèque que vous avez mentionnée, mais en général, il existe deux façons de le faire:

  • P/Invoke aux fonctions de bibliothèque exportées
  • Ajout d'une référence à la bibliothèque de types COM (au cas où vous traitez avec des objets COM).
7
Mehrdad Afshari

P/Invoke est une technologie sympa, et elle fonctionne assez bien, sauf pour les problèmes de chargement du fichier cible DLL. Nous avons trouvé que la meilleure façon de faire les choses est de créer une bibliothèque statique des fonctions natives et liez-le dans un projet Managed C++ (ou C++/CLI) qui en dépend.

7
plinth

Oui, cela s'appelle P/Invoke .

Voici un excellent site de ressources pour l'utiliser avec l'API Win32:

http://www.pinvoke.net/

3
Dana Holt

La technologie utilisée pour ce faire est appelée P/Invoke ; vous pouvez rechercher des articles sur le sujet. Notez que c'est pour appeler C depuis C #, pas tellement C++. Vous devrez donc envelopper votre code C++ dans un wrapper C que votre DLL exporte.

1

Bien sûr. Cet article est un bon exemple de quelque chose que vous pouvez faire pour commencer.

Nous le faisons à partir de C # sur nos appareils Windows Mobile en utilisant P/Invoke .

1
Mat Nadrofsky