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?
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top