Come utilizzare un modulo C ++ da un'app Mono
-
05-07-2019 - |
Domanda
Sto cercando di eseguire la mia app C # / C ++ su Linux dopo averla sviluppata su Windows.
Una piccola parte di esso, FooLib, è scritta in C ++, che è pinvoked da C # per le prestazioni. FooLib non utilizza chiamate di sistema, ma solo funzionalità C ++ standard. Esporta una singola funzione, dichiarata come:
extern "C" __declspec(dllexport) void Foo(float*, int, float*);
È compilato con Visual C ++. Ho provato a eseguire l'app in mono con il FooLib.dll compilato da Windows, ma il caricamento della DLL (DllImport) non è riuscito con:
Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])
Quindi, cosa dovrei fare?
- Modificare la dichiarazione di esportazione in qualche modo?
- Compilare l'oggetto in una libreria .so con gcc su Linux, quindi caricarlo?
- Compilalo in un file .dll con gcc su Linux, quindi caricalo?
- Qualcos'altro?
Soluzione
Devi ricompilare la tua libreria su Linux, otterrai un foolib.so. Quindi devi creare una DllMap ( controlla questo link ) in modo da non dover specifica un nome di libreria * .so per Linux nel tuo codice C # e un * .dll separato per Windows - questo è solo un modo per mappare comodamente il nome della libreria a seconda del sistema operativo.
Altri suggerimenti
Uno strumento molto interessante per automatizzare i binding nativi è SWIG. http://www.swig.org/
Accetto il primo commento. Il tuo codice .NET dovrebbe funzionare bene su Linux senza ricompilare, ma la tua chiamata nativa deve essere compilata in modo nativo.