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.

enter image description here

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.

22
demandé sur Dan James Palmer 2013-08-09 19:32:19

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.

8
répondu S. Larws 2015-12-01 15:22:11

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();
8
répondu Kirk Backus 2016-02-25 19:06:59

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 ...

4
répondu Dieter Lücking 2013-08-09 17:35:50