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?
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top