2009-10-22 11 views
0

J'essaie d'exécuter mon application C#/C++ sous Linux après l'avoir développée sous Windows.Comment utiliser un module C++ à partir d'une application Mono

Une petite partie, FooLib, est écrite en C++ qui est pinvoked de C# pour la performance. FooLib n'utilise aucun appel système, seulement la fonctionnalité C++ standard. Il exporte une seule fonction, déclarée comme:

extern "C" __declspec(dllexport) void Foo(float*, int, float*); 

Il est compilé avec Visual C++. J'ai essayé de lancer l'application en mono avec les fenêtres compilé FooLib.dll, mais le chargement dll (DllImport) a échoué avec:

Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[]) 

Alors, que dois-je faire?

  • Modifier la déclaration d'exportation d'une manière ou d'une autre?
  • Compilez la chose dans une bibliothèque .so avec gcc sous Linux, puis chargez-la?
  • Crosscompilez-le en .dll avec gcc sous Linux, puis chargez-le?
  • Quelque chose d'autre?

Répondre

2

Vous devez recompiler votre bibliothèque sous Linux, vous obtiendrez un fichier foolib.so. Ensuite, vous devez créer un DllMap (check this link) afin que vous n'ayez pas à spécifier un nom de bibliothèque * .so pour Linux dans votre code C# et un * .dll distinct pour Windows - c'est juste un moyen de mapper facilement le nom de la bibliothèque en fonction de l'OS.

0

Un outil très cool pour automatiser les liaisons natives est SWIG. http://www.swig.org/

D'accord avec le 1er commentaire. Votre code .NET devrait fonctionner correctement sous Linux sans aucune recompilation, mais votre invocation native doit être compilée de manière native.