Utilisation de DLL de classe C ++ dans une application C #

J’ai une DLL C ++ non gérée qui exporte simplement une seule classe (pas COM … c’est juste une simple classe C ++) comme interface. Je veux utiliser cette classe en C # mais on me dit qu’elle ne peut pas simplement être imscope dans C #.

Quelle est la bonne façon d’utiliser cette classe dans mon application C #?

Manière simple en supposant la classe Foo:

  1. Créez un projet C ++ / CLI, appelez-le FooWrapper.
  2. Faites en sorte que FooWrapper dépende de la DLL non gérée (comme vous le feriez normalement).
  3. Créez une classe managée ManagedFoo qui contient un seul champ d’instance privé de type Foo *.
  4. fournir des fonctions d’encapsulation publiques dans ManagedFoo qui transmettent au champ d’instance sous-jacent.
  5. En option (bien que recommandé):
    • convertir les parameters des idiomes .net (chaînes de caractères et autres) en idiomes C ++ (std :: ssortingng ou char *)
    • intercepter les exceptions non managées et lancer celles gérées à la place

Ensuite, vous faites en sorte que votre code c # dépende du projet / dll FooWrapper et que la DLL non gérée soit correctement déployée avec lui, la manière dont cela est fait dépend de la DLL non gérée mais normalement, le même répertoire est suffisant.

Si les fonctions ne reposent pas sur des instances de la classe, P / Invoke est encore plus simple

Cette réponse pourrait être exagérée pour une bibliothèque de classes unique, mais SWIG est une bonne solution pour “encapsuler” les classes C / C ++ à utiliser dans d’autres langages. Cela fonctionne bien avec C #.

Voir http://www.swig.org/ .

DllImport est votre meilleur pari. Il y a un peu de massage de type de données, surtout si vous transmettez des structures, mais vous pouvez presque tout faire avec.

Vous avez besoin d’un intermédiaire proxy (modèle GoF) pour relier la limite gérée / non gérée.

Deux options:

  • Un wrapper C ++ / CLI
  • Un wrapper COM.

Le premier sera plus direct, et le second aura deux étapes: C ++ -> COM -> .NET.

Parfois, il est plus facile de fournir votre propre interface C. SWIG n’est pas sortingvial à configurer. J’ai utilisé C ++ et C ++ / CLI gérés et ils vont bien. Le plus simple était de faire un wrapper C (et peut être utilisé par n’importe quel autre langage car la plupart ont un moyen d’appeler une fonction C).