Golang,在Linux中加载Windows DLL

时间:2017-10-09 12:45:23

标签: linux go dll system-calls

我们的供应商提供适用于Windows的DLL。是否可以加载自定义 xxx.dll 文件并使用Go在 Linux 中使用其功能?

像这样:https://github.com/golang/go/wiki/WindowsDLLs

2 个答案:

答案 0 :(得分:3)

简短的回答是“不”:当您“加载”动态链接库时,它不仅实际加载(如从文件中读取),而是链接到您的地址空间运行程序 - 通过操作系统提供的特殊方法(在基于Linux的系统上,至少在x86 / amd64平台上是一个外部进程;在Windows上,它是一个内核工具,AFAIK)。 换句话说,加载动态链接库会让你背后发生很多复杂的事情。

另一个复杂因素是DLL是否是“自包含”的,它只包含“纯”函数 - 它只对输入数据执行计算以提供输出数据,或者它们调用操作系统在文件上执行I / O等活动。 操作系统为运行进程提供这些活动的方式在Windows和Linux之间完全不同。

我能想到的最后一个复杂因素是这个库对其他人的依赖。 如果库的代码是用C或C ++编写的,很可能取决于编译库的编译器所使用的C库(在Windows上,它通常是MSVCRxx.DLL的东西)。 (一个简单的例子是在库的代码中调用malloc()printf()或类似的内容。)

所有这些意味着在Windows for Windows上编写的大多数DLL都依赖于Windows和与用于构建该库的编译器相关联的C或C ++标准库。

更不用说Windows DLL为其模块使用PE(可移植可执行文件)格式,而基于GNU / Linux的系统本身使用ELF格式作为其共享对象文件。

答案 1 :(得分:0)

我担心不是因为Windows DLL与Linux共享对象进行不同的内核调用,两者都有系统库对象的这个奇特名称

但是如果你需要在Linux上运行一个Windows原生应用程序,我会建议尝试一下Wine,我怀疑它是否正常工作,第二个值得尝试的是dosbox,一旦我怀疑它也有效

但是如果这些DLL是用.net框架编写的,那么你可以将它们包装在一个很好的c#代码上并在linux端使用mono,但不确定这是否能让你将这些DLL导入golang,但是我不这么认为

在使用一定数量的技巧让你的一切正常运行时,你会遇到一些性能问题,只需说出

即可