Como usar um módulo de C ++ a partir de um aplicativo Mono
-
05-07-2019 - |
Pergunta
Eu estou tentando executar o meu aplicativo C # / C ++ no Linux depois desenvolvê-lo no Windows.
Uma pequena parte dela, FooLib, é escrito em C ++ que é pinvoked de C # para o desempenho. FooLib não usa chamadas de sistema, único padrão C ++ funcionalidade. Ela exporta uma única função, declarada como:
extern "C" __declspec(dllexport) void Foo(float*, int, float*);
É compilado com Visual C ++. Eu tentei executar o aplicativo em mono com o windows-compilados FooLib.dll, mas a carga de dll (DllImport) falhou com:
Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])
Então, o que devo fazer?
- Alterar a declaração de exportação, de alguma forma?
- Compilar a coisa em uma biblioteca .so com gcc no Linux, em seguida, carregar isso?
- cross-compilar-lo em um .dll com gcc no Linux, em seguida, carregar isso?
- Algo mais?
Solução
Você precisa recompilar sua biblioteca no Linux, você vai ter um foolib.so. Então você tem que criar um DllMap ( consultar este link ) para que você não tem que especificar um * .so nome da biblioteca para Linux em seu código C # e * .dll separado para Windows -. isso é apenas uma maneira de convenientemente mapear o nome da biblioteca dependendo do sistema operacional
Outras dicas
Uma ferramenta muito legal para automatizar ligações nativas é SWIG. http://www.swig.org/
Concordo com o primeiro comentário. Seu código .NET deve correr bem no Linux sem recompilação, mas suas necessidades de invocação nativas para ser compilado nativamente.