如何使用Mono应用程序中的C ++模块

时间:2009-10-22 18:36:01

标签: .net dll mono dynamic-linking

我正在尝试在Windows上开发我的C#/ C ++应用程序。

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

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

它是用Visual C ++编译的。我尝试使用Windows编译的FooLib.dll在mono下运行应用程序,但是dll加载(DllImport)失败了:

Unhandled Exception: System.DllNotFoundException:Foo(single[2],int,single[])

那么,我该怎么办?

  • 以某种方式更改导出声明?
  • 在Linux上用gcc将该东西编译成.so库,然后加载它?
  • 在Linux上使用gcc将其交叉编译为.dll,然后加载?
  • 别的什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

自动化本机绑定的一个非常酷的工具是SWIG。 http://www.swig.org/

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