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.
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
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.
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.
Réponses:
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é.
la source
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:
la source
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.
la source
Oui, cela s'appelle P / Invoke .
Voici un excellent site de ressources pour l'utiliser avec l'API Win32:
http://www.pinvoke.net/
la source
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 .
la source
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.
la source
Avez-vous envisagé Apache Thrift?
http://thrift.apache.org/
Cela semble être une solution très très soignée.
la source