Quelles sont les meilleures pratiques lors de l’utilisation de SWIG avec C# ?

StackOverflow https://stackoverflow.com/questions/25268

  •  09-06-2019
  •  | 
  •  

Question

Quelqu'un a-t-il utilisé le LAMPÉE bibliothèque avec C# ?Si c’est le cas, quels pièges avez-vous trouvé et quelle est la meilleure façon d’utiliser la bibliothèque ?Je pense l'utiliser comme wrapper pour un programme écrit en C et je souhaite envelopper les fichiers d'en-tête là où je peux les utiliser dans mon application .NET.

Modifier:Quelques précisions sur les OS cibles.

J'ai l'intention d'exécuter l'application sous Linux et Windows, c'est pourquoi je m'intéresse à SWIG.P/Invoke n'est pas une option.

Était-ce utile?

La solution

Je pense que l'erreur des affiches précédentes a été de lire la documentation et de ne pas regarder les exemples.

Il y a quelques heures, j'avais besoin d'interfacer certaines classes C++ avec C#.J'ai regardé dans mon répertoire Swig (je l'avais déjà pour d'autres travaux), j'ai trouvé le répertoire Examples/csharp/class, j'ai parcouru le code, chargé la solution, l'ai parcouru, copié, mis mon code, cela a fonctionné, mon travail était terminé.

Cela dit, le code P/Invoke généré n'est pas une solution pour tous les besoins.En fonction de votre projet, il peut être tout aussi simple d'écrire vous-même des wrappers d'API simples ou d'écrire du C++ géré (recherchez SlimDX pour un superbe exemple).

Pour mes besoins, c'était simple et facile - j'avais mystuff.dll, et maintenant en plus je peux expédier mystuffnet.dll.Je conviens que le document est difficile à aborder.

Modifier:J'ai remarqué que le PO ne mentionnait que C.Pour cela, vous n'avez pas vraiment besoin de Swig, utilisez simplement le syntaxe d'interopérabilité habituelle C#/C DLLImport.Swig devient utile lorsque vous souhaitez laisser Cours de C++ être invoqué à partir de C#.

Autres conseils

Pour mon dernier projet, voici l'intégralité du fichier de configuration C# SWIG :

%module mdProject

%{
#include "mdProject.h"
%}

Je l'ai compilé dans SWIG avec :

swig -csharp -c++ -I../../Include mdProject.i

Cela a généré un Project.cxx que j'ai compilé et lié directement à la DLL « principale », je n'ai donc pas eu besoin d'une deuxième DLL « d'assistance » C++.SWIG a également généré un tas de fichiers C# que j'ai compilés dans une DLL .NET.Mes autres wrappers (Java, PHP, etc.) utilisent une DLL d'assistance.

Comme @patrick l'a mentionné, SWIG utilise P/Invoke, donc si vous rencontrez un problème avec cela, vous devrez trouver une autre solution.

Si vous utilisez des types qui s'écartent de l'ordinaire (vides, structures, etc.), vous devrez faire un travail supplémentaire pour bien faire les choses, mais pour l'API moyenne utilisant des int, des char*, etc., c'est bien.

J'ai essayé d'utiliser SWIG pour envelopper un projet C++ à utiliser dans .NET il y a quelques années.

Je ne suis pas allé très loin car c'était une énorme douleur de produire la configuration requise par SWIG.A l'époque je voulais juste une solution, pas apprendre un autre langage/api/etc.SWIG est peut-être plus facile à utiliser de nos jours, je ne pourrais pas vous le dire.

Nous avons fini par utiliser Managed C++ pour envelopper le projet C++.Cela a très bien fonctionné.

Si vous appelez simplement des fonctions directement à partir d'une DLL, je vous suggère de ne vous soucier d'aucun des éléments ci-dessus et d'utiliser simplement P/Invoquer

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top