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

86

Est-il possible d'appeler du code C ++, éventuellement compilé sous forme de 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 réseau RakNet.

Peter Mortensen
la source
Unmanged c ++ to mangaged c #: c-sharpcorner.com/uploadfile/tanmayit08/…
Tyler S. Loeper

Réponses:

90

Un moyen simple d'appeler en C ++ consiste à 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 l'interopérabilité 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-la comme ceci:

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

Consultez ce billet de blog pour un exemple plus expliqué.

Éclipse
la source
2
le lien est rompu pour le billet de blog :(
Vidar
9

Je ne connais pas la bibliothèque que vous avez mentionnée, mais en général, il y a plusieurs 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 auriez affaire à des objets COM).
Mehrdad Afshari
la source
9

P / Invoke est une technologie intéressante, et cela fonctionne assez bien, sauf pour des problèmes de chargement du fichier DLL cible. Nous avons constaté que la meilleure façon de faire les choses est de créer une bibliothèque statique de fonctions natives et de la lier à un projet C ++ géré (ou C ++ / CLI) qui en dépend.

socle
la source
J'ai eu des problèmes avec les rappels et p / invoke. Le passage à C ++ / CLI a résolu ces problèmes.
MedicineMan
2

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

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

Mat Nadrofsky
la source
2

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 à partir de C #, pas tellement C ++. Vous devrez donc envelopper votre code C ++ dans un wrapper C que votre DLL exporte.

Frank Schwieterman
la source