Importer un C++ .lib et .h fichier dans un projet C#?
Je viens de commencer un projet C# et que vous souhaitez importer un C++ .lib et il est correspondant de l'en-tête (.h) fichier.
J'ai lu les différents posts que tous les mentionner .dll, plutôt que .lib, ce qui est source de confusion pour moi.
L'image ci-dessous montre l' .lib et .h fichier je fais référence, tout ce que j'ai fait est de les faire glisser dans le projet.
Quelqu'un peut-il m'indiquer une explication plus claire de la façon de faire? Je suis sûr qu'il peut pas être aussi difficile qu'il y paraît.
- Voir ce site qui a beaucoup de bonnes informations sur ce: http://social.msdn.microsoft.com/Forums/vstudio/en-US/299da822-5539-4e5b-9ba7-b614e564c9f4/presenting-a-c-library-lib-for-use-in-c-project
- Je vais prendre un coup d'oeil à Chris, merci
Vous devez vous connecter pour publier un commentaire.
Ce que vous pourriez faire, est de créer un C++/CLI wrapper et exposer les fonctionnalités de la lib que vous voulez utiliser votre enveloppe. La création wrapper dll, vous pouvez facilement de référence dans votre projet C#. Bien sûr, cela prend un peu de travail pour créer les sites gérés et non gérés wrapper, mais sera payante à long terme.
Pour créer un projet C++ managé choisir dans le cadre du projet C++ modèles CLR et de la Bibliothèque de Classe. Ici vous pouvez lier à votre lib, utilisez le fichier d'en-tête de la manière que vous avez utilisé pour.
Prochaine créer une nouvelle classe (classe de référence) et l'enveloppe de votre bibliothèque en elle. Un exemple pourrait ressembler à quelque chose comme ceci:
Vous écrire un wrapper de la classe comme ceci:
En-tête:
Votre Mise En Œuvre:
Espaces de noms et de toutes les bonnes choses omises pour des raisons de simplicité.
Maintenant, vous pouvez utiliser MyWrapper dans votre code C# tout aussi facile que de toute autre classe gérée. Bien sûr, lorsque l'interface de la lib devient plus compliqué, vous devez réfléchir un peu plus, mais il peut être utile de séparer les lib-code de votre application. Espère avoir éclairer.
C'est, malheureusement, un non-trivial problème.
La raison en est principalement dû au fait que
C++
est un langage non managé.C#
est un géré langue. Gérés et non gérés désigne la façon dont une langue qui gère la mémoire.C++
vous devez faire votre propre gestion de la mémoire (allocation et de libérer),C# .NET Framework
n'gestion de la mémoire avec un garbage collector.Dans votre bibliothèque de code
Vous doit assurez-vous que tous les endroits que vous appelez
new
, doit faire appeldelete
, et il en va de même pourmalloc
etfree
si vous utilisez leC
conventions.Vous aurez à créer un tas de classes wrapper autour de vos appels de fonction, et assurez-vous que vous n'êtes pas une fuite de mémoire dans votre
C++
code.Le problème
Votre principal problème (à ma connaissance) est que vous ne serez pas en mesure d'appeler ces fonctions directement dans
C#
parce que vous ne pouvez pas lier statiquement non code en code managé.Vous aurez à rédiger un .dll pour placer toutes vos fonctions de la bibliothèque dans
C++
. Une fois que vous faites, vous pouvez utiliser leC#
interop de la fonctionnalité d'appel de ces fonctions à partir de la dll.Il est "aussi difficile que cela semble". C++ et C# sont ambivalentes. La première est déterministe, la destruction, la seconde non. Maintenant, vous écrivez en C++/cli retarder la destruction de certains finaliseur appelé par le garbage collector de travail dans son propre thread, l'introduction de tous les problèmes sur le lieu (fil de sécurité, le C++ membres (utilisé en c++/cli) est-elle valide?, ...). Pire encore, le GC peut suggérer des objets en C++ étant minuscule (un pointeur) et de provoquer une sorte de fuite de mémoire (en raison de la fin de la désallocation de petits objets). Essentiellement, vous vous retrouvez dans l'écriture d'un GC sur le dessus du C++/cli GC à supprimer non C++/cli (!) les objets dans le thread principal ou d'une autre. Tout ce qui est fou, ...