Importer un c++.lib et.h file dans un projet C#?
je viens de démarrer un projet C# et je veux importer un C++ .lib et son en-tête correspondant (.h) fichier.
j'ai lu divers articles qui mentionnent tous .dll, plutôt que .lib, ce qui est source de confusion pour moi.
l'image ci-dessous montre le .lib et .je fais référence au fichier h, Tout ce que j'ai fait c'est les faire entrer dans le projet.
quelqu'un peut-il m'expliquer plus clairement comment procéder? Je suis sûr qu'il peut pas être aussi difficile qu'il y paraît.
3 réponses
ce que vous pourriez faire, c'est créer un wrapper C++/CLI et exposer les fonctionnalités de la lib que vous voulez utiliser via votre wrapper. La dll d'enrubannage créée que vous pouvez facilement référencer dans votre projet C#. Bien sûr, cela demande un peu de travail pour créer l'enveloppe gérée/non gérée, mais cela portera ses fruits à long terme.
pour créer un projet C++ géré, sélectionnez sous les modèles de projet C++ CLR et la bibliothèque de classe. Ici vous pouvez lier à votre lib, utilisez le fichier d'en-tête de la façon dont vous utilisé pour.
créer une nouvelle classe (Classe ref) et envelopper votre bibliothèque dedans. Un exemple pourrait ressembler à quelque chose comme ceci:
LibHeader.h
int foo(...);
Vous écrivez une classe wrapper comme ceci: En-tête:
Wrapper.h
public ref class MyWrapper
{
public:
int fooWrapped();
};
Votre Application:
Wrapper.cpp
#include Libheader.h
int MyWrapper::fooWrapped()
{
return foo();
}
les espaces de noms et de toutes les bonnes choses omises pour des raisons de simplicité. Maintenant, vous pouvez utiliser MyWrapper dans votre code C# aussi facilement que n'importe quelle autre classe gérée. Bien sûr, lorsque l'interface de la lib devient plus compliquée, vous devez pensez-y un peu plus, mais cela pourrait aider à séparer le lib-code de votre application. Espère avoir éclairer.
c'est, malheureusement, un problème non négligeable.
la raison est principalement due au fait que C++
est un langage non géré. C#
est un réussi de la langue. Géré et non géré fait référence à la façon dont un langage gère la mémoire.
C++
vous devez faire votre propre gestion de mémoire (allouer et libérer),C# .NET Framework
gestion de la mémoire avec un poubelle collector.
dans votre code de bibliothèque
Vous assurez-vous que tous les endroits que vous appelez new
, doit appeler delete
, et il en va de même pour malloc
et free
si vous utilisez le C
conventions.
Vous devrez créer un tas de classes d'emballage autour de vos appels de fonction, et assurez-vous que vous ne fuyez pas de mémoire dans votre C++
code.
le problème
votre principal problème (à ma connaissance) est que vous ne pourrez pas appeler ces fonctions directement en C#
parce que vous ne pouvez pas lier statiquement le code non géré dans le code géré.
vous devrez écrire un .dll pour envelopper toutes vos fonctions de bibliothèque dans C++
. Une fois que vous faites, vous pouvez utiliser le C#
interop fonctionnalité pour appeler ces fonctions de la dll.
[DllImport("your_functions.dll", CharSet = CharSet.Auto)]
public extern void your_function();
c'est "aussi dur que ça en a l'air". C++ et C# sont ambivalents. La première a une destruction déterministe, la Seconde pas. Maintenant, vous écrivez C++ / cli retardant la destruction à un finaliseur appelé par le collecteur d'ordures travaillant dans son propre fil, introduisant des problèmes partout (sécurité du fil, les membres C++ (utilisés en c++ / cli) sont-ils valides?, ...). Pire encore, le GC pourrait suggérer que les objets C++ sont minuscules (un pointeur) et provoquent une sorte de fuite de mémoire (due à la désallocation tardive des objets minuscules). Essentiellement, vous finissez par écrire un GC sur le C++/cli GC pour supprimer le non c++ / cli (!) des objets dans le thread principal ou d'une autre. Tout ce qui est fou ...