使用Visual Studio构建C ++ DLL - Linux上的PInvoke

时间:2014-01-20 21:13:45

标签: c# c++ linux mono pinvoke

这就是我想要实现的:在Visual Studio上构建本机C ++ DLL库,并通过PInvoke从C#应用程序调用其在Ubuntu Linux \ Mono上的方法。简化代码:

[DllImport("MyLib")]
static extern int MyFunction();

static void Main(string[] args)
{
  int result = MyFunction();
}

在Windows上,它就像一个魅力。 我在mono上运行这个示例应用程序,但是我收到错误:DllNotFoundException。当我启用单声道调试(MONO_LOG_LEVEL="debug" mono MyApp.exe)时,我可以看到找到此DLL,但由于错误而无法加载:“无效的ELF标头”。我想DLL必须用一些特殊的标志编译,所以linux可以识别它。怎么做?

3 个答案:

答案 0 :(得分:3)

Visual Studio提供的C ++编译器以Windows为目标。您正在尝试在Linux上执行代码,因此您需要使用针对Linux的编译器来编译代码。您根本无法在Linux上本机执行Windows DLL。

您的解决方案是将源代码转换为Linux C ++编译器并编译Linux共享库。

答案 1 :(得分:0)

这不起作用。非托管库特定于您运行的平台,因此对于Linux上的Mono,您的非托管库需要是.so

答案 2 :(得分:0)

根据Mono Documentation,您必须将DllImportX相关联,而Mono应进行名称翻译。

例如:

[DllImport("X")]
static extern int MyFunction();

此行应链接到Windows上的X.dll,Linux和Unix上的libX.so以及Mac OS X上的X.dylib。您必须在{{1}的本机计算机上构建每一行。或者你是一个交叉编译器来完成这项工作。

请注意,即使您本机编译它,如果它使用本机API(例如WIn32 API),它也不会在其他平台上编译。您必须使用跨平台开发工具,库和模式来解决这些问题。