.net 如何使用C++;来自Mono应用程序的模块

.net 如何使用C++;来自Mono应用程序的模块,.net,dll,mono,dynamic-linking,.net,Dll,Mono,Dynamic Linking,在Windows上开发完C#/C++应用后,我正在尝试在Linux上运行它 FooLib的一小部分,是用C++编写的,用于从C语言中调用。WORIIB不使用系统调用,只使用标准C++功能。它导出一个函数,声明为: extern "C" __declspec(dllexport) void Foo(float*, int, float*); 是用Visual C++编写的。我尝试在mono下使用windows编译的doublib.dll运行应用程序,但dll加载(DllImport)失败,原因

在Windows上开发完C#/C++应用后,我正在尝试在Linux上运行它

FooLib的一小部分,是用C++编写的,用于从C语言中调用。WORIIB不使用系统调用,只使用标准C++功能。它导出一个函数,声明为:

extern "C" __declspec(dllexport) void Foo(float*, int, float*);

是用Visual C++编写的。我尝试在mono下使用windows编译的doublib.dll运行应用程序,但dll加载(DllImport)失败,原因是:

Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])
那么,我该怎么办

  • 以某种方式更改导出声明
  • 在Linux上用gcc将它编译成一个.so库,然后加载它
  • 在Linux上用gcc交叉编译成.dll,然后加载它
  • 还有别的吗

你需要在Linux上重新编译你的库,你会得到一个傻瓜。然后您必须创建一个DllMap(),这样您就不必在C#代码中为Linux指定一个*.so库名,并为Windows指定一个单独的*.dll-这只是一种根据操作系统方便地映射库名的方法。

一个非常酷的自动本机绑定工具是SWIG。

同意第一条评论。您的.NET代码应该在Linux上运行良好,无需任何重新编译,但您的本机调用需要本机编译