Créer un objet c ++ non géré dans c #
J'ai une dll non managée avec une classe "Maclasse".
Maintenant, est-il un moyen de créer une instance de cette classe dans le code C#? À l'appel de son constructeur? J'ai essayé, mais le visual studio signale une erreur avec un message que cette zone de mémoire est endommagé ou quelque chose.
Merci d'avance
source d'informationauteur Evgeny007
Vous devez vous connecter pour publier un commentaire.
C# ne peut pas créer d'instance de classe exportés à partir de Dll native. Vous avez deux options:
Créer en C++/CLI wrapper. C'est .NET de la Bibliothèque de classes qui peuvent être ajoutés en tant que Référence pour tous les autres .Un projet de réseau. En interne, C++/CLI classe fonctionne avec des non géré classe, des liens vers les Dll native en C++ standard de règles. Pour .NET client, ce C++/CLI classe ressemble .NET de classe.
Écrire C wrapper C++ de la classe, qui peut être utilisé par .NET client avec PInvoke. Par exemple, sur la simplification de la classe C++:
De l'API C de l'enveloppe pour cette classe:
CreateInstance, ReleaseInstance et GetData peut être déclarée en C# client à l'aide de PInvoke, et a appelé directement. void* paramètre doit être déclarée comme IntPtr dans PInvoke déclaration.
Vous ne pouvez pas utiliser unmanged code C++ en C#. L'interopérabilité peut être fait en utilisant PInvoke. Il y a un grand nombre de questions liées à ce sujeten particulier lors de l'appel de fonctions qui ont des pointeurs comme arguments.
La procédure de base qui va comme ceci:
C# partie
C++ partie
La solution c'est de créer de C++/CLI wrapper comme:
où CDllExportClass est la classe exportés à partir du code natif. Ci-dessus est le .h du C++/CLI. Prendre soin de laisser trouver la lib de cette dll. Mettre la dll et la lib dans le même répertoire et compiler le C++/CLI code.Dans le code managé répertoire de mettre la dll native et le C++/CLI dll. Dans la gestion de projet a permis de mettre la référence du C++/CLI projet. L'instancier dans le m. maged code C++/CLI classe comme:
C'est tout.