Как использовать модуль C ++ из приложения Mono
-
05-07-2019 - |
Вопрос
Я пытаюсь запустить свое приложение на C # / C ++ в Linux после разработки его в Windows.
Небольшая его часть, FooLib, написана на C ++, который заимствован из C # для повышения производительности.FooLib не использует системных вызовов, только стандартную функциональность C ++.Он экспортирует единственную функцию, объявленную как:
extern "C" __declspec(dllexport) void Foo(float*, int, float*);
Он скомпилирован с помощью Visual C ++.Я попытался запустить приложение под управлением mono с помощью скомпилированного Windows FooLib.dll , но загрузка dll (DllImport) завершилась неудачей с:
Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])
Итак, что мне следует делать?
- Каким-то образом изменить декларацию экспорта?
- Скомпилируйте это в библиотеку .so с gcc в Linux, а затем загрузите это?
- Скомпилировать его в .dll с gcc в Linux, затем загрузить это?
- Что-то еще?
Решение
Вам нужно перекомпилировать вашу библиотеку в Linux, вы получите foolib.so.Затем вам нужно создать DllMap (проверьте эту ссылку) так что вам не нужно указывать имя библиотеки * .so для Linux в вашем коде C # и отдельную *.dll для Windows - это просто способ удобно сопоставить имя библиотеки в зависимости от операционной системы.
Другие советы
Очень классным инструментом для автоматизации собственных привязок является SWIG.http://www.swig.org/
Согласен с 1-м комментарием.Ваш .СЕТЕВОЙ код должен нормально работать в Linux без какой-либо перекомпиляции, но ваш собственный вызов должен быть скомпилирован изначально.