4

这是设置:

我有一个共享库(带有外部“C”方法的 c++)我在 linux 中编译并创建了一个 library.so 文件。

我在同一个盒子(Ubuntu)上使用了 Mono Develop,并且能够 DLLImport("library.so") 并访问我的外部函数没问题。

当我将该 .so 文件复制到 Windows 机器(Win7)并尝试做同样的事情时,问题就出现了,但这次使用 MonoDevelop 在 Windows 下运行 Mono。

我得到一个 System.BadImageFormatException。我试过在 library.so 文件之前做一个“./”,但没有任何帮助。我已经检查并仔细检查了它正在查看正确的目录,并且确实如此。

为什么我无法在 Windows/Mono 下访问这个 .so 文件,我是否遗漏了一些重要的东西?

4

2 回答 2

8

您不能在 Windows 上将 .so elf 二进制文件用于您的本机代码。您需要将其重新编译成 Windows 支持的本机二进制文件(即 .dll)。

我建议您阅读我们的wiki 页面,了解托管和非托管代码之间的跨平台互操作。

于 2010-10-25T17:50:11.737 回答
2

问题是 Linux SO 不是有效的 Windows 映像。您需要将 Windows 下的 C++ 代码编译为 DLL 并导出该方法,以便您可以使用 p/Invoke 调用它。

C/C++ 在源代码级别(大部分)是可移植的,而不是在二进制级别,因此您不能将 Linux .so 复制到 Windows 并期望它可以在 Windows 平台上执行。我相信这会引发一个问题,为什么您可以将 .NET/Mono dll 和 exe 从窗口复制到 Linux 并让它们运行,这是因为 Mono CLI 实现具有能够从 Windows 映像加载 IL 的代码( PE) 然后在 VM 中执行加载的 IL,因此在这种情况下,执行的不是本机二进制代码,而是从 DLL/EXE 容器文件加载的平台独立 IL。

于 2010-10-25T17:48:14.047 回答