如何使用Mono将.so文件链接到托管DLL

时间:2018-08-24 19:16:13

标签: c# mono native dllimport managed-c++

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

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

其他一些信息: 1.我没有本机外部库的源代码。我有x86,x64和一个.so库。 2.我试图制作一个可访问.so但无法使其在桌面上编译的Manage C ++填充程序,因为Windows无法识别.so文件。

一些想法: 1.是否有一种方法可以将本机DLL嵌入到托管库中,以便Mono也可以转换本机DLL? 2.我可以将.so文件链接到托管C ++项目吗? 3.是否可以告诉Mono在执行过程中合并该Dll?

最终,我正在寻找一种封装在exe中的解决方案,该解决方案使我能够像以前一样简单地运行它并控制本机系统。

1 个答案:

答案 0 :(得分:0)

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

.Net无法识别出这种情况,但是Mono可以识别。