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


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é.


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).

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.


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



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.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.