无法从Windows Mono C#项目访问Linux gcc编译的.so共享库

4
这是设置的情况:
我有一个共享库(c++带extern "C"方法),在Linux上编译并创建了一个library.so文件。
我在同一台机器上使用Mono Develop(Ubuntu),能够DLLImport("library.so")并且无问题地访问我的外部函数。
问题出现在当我将该.so文件复制到Windows机器(Win7)并尝试做同样的事情时,这次在Windows下运行Mono与MonoDevelop。
我得到了System.BadImageFormatException。我尝试在library.so文件之前加上“./”,但没有用。我已经检查过多次它是否在正确的目录下,确实如此。
为什么我不能在Windows/Mono下访问这个.so文件?
2个回答

8

我一直认为这是一个大问题。我希望Mono能够绕过这个问题,然后它就可以正常工作了。看来不行。感谢提供链接! - Nick
问题在于,当涉及到P/Invokes时,Mono会将控制权“交还”给底层操作系统,因此无法绕过这一点。 - Jb Evain

2
问题是Linux的SO文件不是有效的Windows映像。您需要在Windows下编译C++代码作为DLL,并导出该方法,以便可以使用p/Invoke调用它。
C/C++在源级别上是可移植的(大多数情况下),而不是在二进制级别上,因此您不能将Linux的.so文件复制到Windows上,并期望其在Windows平台上可执行。我相信这会引出一个问题,为什么您可以将.NET/Mono DLL和EXE从Windows复制到Linux并运行它们,因为Mono CLI实现具有能够从Windows映像(PE)中加载IL,然后在VM中执行加载的IL的代码,所以在这种情况下被执行的不是本机二进制代码,而只是从DLL/EXE容器文件中加载的平台无关的IL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接