È possibile chiamare codice C ++, eventualmente compilato come file di libreria di codice (.dll), da un linguaggio .NET come C #?
In particolare, codice C ++ come la libreria di rete RakNet.
È possibile chiamare codice C ++, eventualmente compilato come file di libreria di codice (.dll), da un linguaggio .NET come C #?
In particolare, codice C ++ come la libreria di rete RakNet.
Risposte:
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.
Non ho familiarità con la libreria che hai menzionato, ma in generale ci sono un paio di modi per farlo:
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.
Sì, si chiama P / Invoke .
Ecco un ottimo sito di risorse per utilizzarlo con l'API Win32:
Certo che lo è. Questo articolo è un buon esempio di qualcosa che puoi fare per iniziare a farlo.
Lo facciamo da C # sui nostri dispositivi Windows Mobile utilizzando P / Invoke .
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.