Comment utiliser un module C ++ à partir d'une application Mono
-
05-07-2019 - |
Question
J'essaie d'exécuter mon application C # / C ++ sous Linux après l'avoir développée sous Windows.
Une petite partie de celle-ci, FooLib, est écrite en C ++, qui est invoquée par C # pour des performances optimales. FooLib n'utilise aucun appel système, seulement les fonctionnalités C ++ standard. Il exporte une fonction unique, déclarée comme:
extern "C" __declspec(dllexport) void Foo(float*, int, float*);
Il est compilé avec Visual C ++. J'ai essayé d'exécuter l'application sous mono avec FooLib.dll compilé avec Windows, mais le chargement de la DLL (DllImport) a échoué avec:
Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])
Alors, que dois-je faire?
- Changer la déclaration d'exportation d'une manière ou d'une autre?
- Compilez l’objet dans une bibliothèque .so avec gcc sous Linux, puis chargez-le?
- Compilez-le dans un fichier .dll avec gcc sous Linux, puis chargez-le?
- Autre chose?
La solution
Vous devez recompiler votre bibliothèque sous Linux, vous obtiendrez un fichier foolib.so. Ensuite, vous devez créer une carte Dll ( vérifier ce lien ) afin que vous n'ayez pas à le faire. spécifiez un nom de bibliothèque * .so pour Linux dans votre code C # et un * .dll distinct pour Windows: c’est un moyen de mapper facilement le nom de la bibliothèque en fonction du système d’exploitation.
Autres conseils
SWIG est un très bon outil d’automatisation des liaisons natives. http://www.swig.org/
D'accord avec le premier commentaire. Votre code .NET devrait fonctionner correctement sous Linux sans aucune recompilation, mais votre appel natif doit être compilé en mode natif.