È possibile chiamare codice C ++ da C #?


Risposte:


90

Un modo semplice per chiamare in C ++ consiste nel creare un assembly wrapper in C ++ / CLI. In C ++ / CLI puoi chiamare codice non gestito come se stessi scrivendo codice nativo, ma puoi chiamare codice C ++ / CLI da C # come se fosse scritto in C #. Il linguaggio è stato fondamentalmente progettato con l'interoperabilità nelle librerie esistenti come "app killer".

Ad esempio, compilarlo con l'opzione / clr

#include "NativeType.h"

public ref class ManagedType
{
     NativeType*   NativePtr; 

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

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

Quindi in C # aggiungi un riferimento all'assembly ManagedType e usalo in questo modo:

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

Dai un'occhiata a questo post del blog per un esempio più spiegato.


2
il collegamento è interrotto per il post sul blog :(
Vidar

9

Non ho familiarità con la libreria che hai menzionato, ma in generale ci sono un paio di modi per farlo:

  • P / Invoke to exported library functions
  • Aggiunta di un riferimento alla libreria dei tipi COM (nel caso tu abbia a che fare con oggetti COM).

9

P / Invoke è una buona tecnologia e funziona abbastanza bene, tranne per i problemi di caricamento del file DLL di destinazione. Abbiamo scoperto che il modo migliore per fare le cose è creare una libreria statica di funzioni native e collegarla a un progetto C ++ gestito (o C ++ / CLI) che dipende da esso.


Ho avuto problemi con i callback e p / invoke. Il passaggio a C ++ / CLI ha risolto questi problemi.
MedicineMan



2

La tecnologia utilizzata per farlo si chiama P / Invoke ; puoi cercare articoli sull'argomento. Nota che è per chiamare C da C #, non C ++ così tanto. Quindi dovrai avvolgere il tuo codice C ++ in un wrapper C che la tua DLL esporta.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.