如何 link 一个 .so 文件到一个带有单声道的托管 DLL

How to link a .so file to a managed DLL with mono

我正在 .net 中的 ARM 处理器上编写嵌入式 linux 程序,该程序使用单声道执行。我发现我可以在我的 PC 上简单地编译为 x86 或 x64 架构,将 Debug 目录复制到 linux,然后 运行 使用 mono myProgram.exe 的程序。该程序像这样完美运行,单声道似乎可以解决架构不匹配问题。直到今天,当我尝试合并外部本机 DLL 时,情况仍然如此。

我有外部 DLL 的 x86 和 x64 位架构,并且都可以在桌面环境中正常工作。我有一个 shim class,它使用 [DllImport] 加载外部函数。但是,当我在带有 Mono 的嵌入式 linux 上尝试此操作时,出现 BadImageFormat 异常。我的猜测是 Mono 在启动时以某种方式转换了 exe 中已编译的 DLL,但对外部不执行相同的操作。

一些其他信息: 1. 我没有本地外部库的源代码。我有 x86、x64 和一个 .so 库。 2. 我已经尝试制作一个访问 .so 的管理 C++ shim,但无法在桌面上编译它,因为 windows 无法识别 .so 文件。

一些想法: 1. 有没有办法将本机 DLL 嵌入到托管中,以便 Mono 也可以转换本机 DLL? 2. 我可以 link .so 文件到托管 C++ 项目吗? 3. 有没有办法告诉 Mono 在执行期间合并该 Dll?

最终我正在寻找一个包含在 exe 中的解决方案,它允许我像以前一样简单地 运行 它并控制本机系统。

如果您拥有 Windows 和 Linux 的所有 .dll 和 .so 文件,您可能可以使用 Mono 的 dll 映射功能。 (https://www.mono-project.com/docs/advanced/pinvoke/dllmap/) 用于将 Windows dll 名称映射到 Linux 所以名称。

.Net 无法识别,但 Mono 可以。