Wie einen C ++ Modul aus einem Mono-App nutzen
-
05-07-2019 - |
Frage
Ich versuche, meine C # / C ++ Anwendung auf Linux auszuführen, nachdem es unter Windows zu entwickeln.
Ein kleiner Teil davon, FooLib, ist in C ++ geschrieben, die von C # für die Leistung pinvoked wird. FooLib verwendet keine Systemaufrufe, nur Standard C ++ Funktionalität. Es exportiert eine einzelne Funktion, erklärt wie:
extern "C" __declspec(dllexport) void Foo(float*, int, float*);
Es ist mit Visual C ++ kompiliert. Ich habe versucht, die App unter mono mit der FooLib.dll kompilierte Windows-ausgeführt wird, aber der DLL-Laden (DllImport) schlug fehl mit:
Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])
Also, was soll ich tun?
- Ändern Sie den Export Erklärung in irgendeiner Weise?
- Kompilieren Sie die Sache in eine .so-Bibliothek mit gcc unter Linux, dann, dass laden?
- Crosscompile es in eine DLL mit gcc unter Linux, dann, dass laden?
- Etwas anderes?
Lösung
Sie benötigen eine Bibliothek unter Linux neu zu kompilieren, erhalten Sie eine foolib.so bekommen. Dann müssen Sie eine DllMap erstellen ( überprüfen), so dass Sie nicht zu tun haben, geben Sie eine * .so Bibliotheksnamen für Linux in C # -Code und ein separates * .dll für Windows -. das ist nur eine Möglichkeit, bequem den Namen der Bibliothek zur Karte je nach Betriebssystem
Andere Tipps
Ein sehr cooles Tool für die Automatisierung von nativen Bindungen ist SWIG. http://www.swig.org/
mit dem ersten Kommentar Zustimmen. Ihr .NET-Code sollte auf Linux ohne recompile gut laufen, aber Ihr nativen Aufruf muss nativ kompiliert werden.