Cómo usar un módulo C ++ desde una aplicación Mono
-
05-07-2019 - |
Pregunta
Estoy intentando ejecutar mi aplicación C # / C ++ en Linux después de desarrollarla en Windows.
Una pequeña parte de ella, FooLib, está escrita en C ++ que se pinvoked de C # para el rendimiento. FooLib no usa llamadas al sistema, solo la funcionalidad estándar de C ++. Exporta una sola función, declarada como:
extern "C" __declspec(dllexport) void Foo(float*, int, float*);
Se compila con Visual C ++. Intenté ejecutar la aplicación en mono con el archivo FooLib.dll compilado en Windows, pero la carga de dll (DllImport) falló con:
Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])
Entonces, ¿qué debo hacer?
- ¿Cambiar la declaración de exportación de alguna manera?
- ¿Compila la cosa en una biblioteca .so con gcc en Linux, y luego carga eso?
- Compilarlo en una .dll con gcc en Linux, luego cargarlo.
- ¿Algo más?
Solución
Necesitas recompilar tu biblioteca en Linux, obtendrás una foolib.so. Luego, debe crear un DllMap ( verifique este enlace ) para que no tenga que hacerlo. especifique un nombre de biblioteca * .so para Linux en su código de C # y una * .dll para Windows, eso es solo una forma de asignar el nombre de la biblioteca según el sistema operativo.
Otros consejos
Una herramienta muy interesante para automatizar enlaces nativos es SWIG. http://www.swig.org/
De acuerdo con el primer comentario. Su código .NET debería funcionar bien en Linux sin ninguna recompilación, pero su invocación nativa debe compilarse de forma nativa.