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?
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top