这就是我想要实现的:在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可以识别它。怎么做?
答案 0 :(得分:3)
Visual Studio提供的C ++编译器以Windows为目标。您正在尝试在Linux上执行代码,因此您需要使用针对Linux的编译器来编译代码。您根本无法在Linux上本机执行Windows DLL。
您的解决方案是将源代码转换为Linux C ++编译器并编译Linux共享库。
答案 1 :(得分:0)
这不起作用。非托管库特定于您运行的平台,因此对于Linux上的Mono,您的非托管库需要是.so
。
答案 2 :(得分:0)
根据Mono Documentation,您必须将DllImport
与X
相关联,而Mono应进行名称翻译。
例如:
[DllImport("X")]
static extern int MyFunction();
此行应链接到Windows上的X.dll
,Linux和Unix上的libX.so
以及Mac OS X上的X.dylib
。您必须在{{1}的本机计算机上构建每一行。或者你是一个交叉编译器来完成这项工作。
请注意,即使您本机编译它,如果它使用本机API(例如WIn32 API),它也不会在其他平台上编译。您必须使用跨平台开发工具,库和模式来解决这些问题。