Comment puis-je DllExport une Classe C++ pour une utilisation dans une Application C#
J'ai créé une Dll C++ projet qui contient une classe "myCppClass" et a essayé de Dll exporter en utilisant le code suivant comme décrit par:
http://msdn.microsoft.com/en-us/library/a90k134d(v=vs. 80).aspx
class __declspec(dllexport) CExampleExport : //public CObject
{ ... class definition ... };
J'ai omis le "public CObject" comme cela nécessite afx.h et implique qu'elle est une Dll MFC. Je ne suis pas sûr si c'est une bonne chose ou pas, mais il diffère du projet de DLL paramètres par défaut.
De la ci-dessus liés à la documentation, je suis amené à croire que "toutes les fonctions publiques et les variables de membre" sont disponibles pour l'importation. Comment puis-je accomplir cela en C#? Pouvez simplement créer une instance de la classe?
Edit: je viens de réaliser que le Titre du post, peuvent être trompeuses. L'accent devrait être mis sur DllImport-ing à partir de C# et de s'assurer que j'ai suivi la documentation correctement en C++
OriginalL'auteur Toymakerii | 2011-01-19
Vous devez vous connecter pour publier un commentaire.
C# ne peut pas importer directement des classes C++ (qui sont effectivement de nom de déformation C interfaces).
Sont vos options d'exposer l'intermédiaire de la classe COM, la création d'un wrapper géré à l'aide de C++/CLI ou de l'exposer à un C-interface de style. Je recommanderais le wrapper géré, car c'est le plus facile et donnera le meilleur type de sécurité.
Un C-interface de style pourrait ressembler à quelque chose comme ceci (attention: le code non testé):
C++/CLI-style wrapper devrait ressembler à ceci (attention: le code non testé):
dynamic_cast
devoid*
. Pourrait tout aussi bien utiliser le réel de type pointeur, C# va utiliserIntPtr
dans le p/invoke signatures.Vous avez raison. Je l'ai changé à partir d'un
(T*)
exprimés lors de la relecture... changé en arrière maintenant. Pourrait également utiliser le réel de type pointeur, mais je préfère insister sur le manque de sécurité dans cette approche.Si vous préférez une C++ modèle de style fonte, puis
static_cast
est le seul à utiliser.Seulement quand il est utile de comportement.
dynamic_cast
est le seul que j'ai jamais utiliser (sauf si je suis en train de définir un bon exemple... ne se pose pas vraiment tout ce qui souvent).OriginalL'auteur Zooba
Pour autant que je sais, C# ne peut l'interopérabilité avec les interfaces COM. La chance il n'a pas besoin d'être plein soufflé objet COM avec de registre, il peut être tout bon vieux C++ de la classe de mise en œuvre de IUnknown.
Donc faire quelque chose comme ça en C++:
Et sur le C#, côté vous de faire quelque chose comme ceci:
Vous pouvez faire à peu près tout ce que vous voulez de cette façon, tant que la communication entre C++ et C#, par le biais de l'interface virtuelle.
OriginalL'auteur Zarat
Vous ne pouvez pas créer une classe C++ exemple par le biais de pinvoke à partir de C#. C'est une source de détail d'implémentation, seul le compilateur C++ ne sait combien de mémoire doit être alloué, et quand et comment appeler correctement le constructeur et le destructeur. La taille de l'objet est, de loin, les plus difficiles à vaincre, il n'y a aucune manière que ce soit à faire que fiable.
Si vous ne pouvez pas aplatir la classe C++ dans les méthodes statiques, alors vous devez écrire un wrapper géré. C'est fait avec le C++/CLI langue, vous devez écrire une "classe de référence" qui a la non géré la classe de l'objet stocké comme un pointeur, créé dans le constructeur et supprimés dans le destructeur et finalizer.
OriginalL'auteur Hans Passant
En fait, vous pouvez vous référer à la déformation des noms directement, à l'aide de la Point d'entrée propriété de la DllImport attribut. Voir cette réponse pour plus de détails.
OriginalL'auteur ulatekh
C# et C++ ne sont PAS ABI compatible comme C++ et Delphi, de sorte que vous ne pouvez pas exporter virtuel de la classe de membres (méthodes) et de les déclarer purement virtuel sur les appelant à côté d'une invoquer, parce que le C# ne peut pas gérer vtbl des objets en C++.
Je vous suggère d'envelopper vos classes C++ par COM, de sorte que vous avez un autre effet secondaire positif, que d'autres COM compatible langues peuvent utiliser vos classes.
OriginalL'auteur Martin.Martinsson