Golang,在 Linux 中加载 Windows DLL
Golang, load Windows DLL in Linux
我们的供应商提供了可在 Windows 上运行的 DLL。是否可以使用 Go 加载自定义 xxx.dll 文件并在 Linux 中使用其功能?
恐怕不是,因为 windows DLL 与 Linux 共享对象执行不同的内核调用,两者都有这个奇特的系统库对象名称
但是,如果您需要 运行 windows linux 上的本机应用程序,我建议您尝试一下 Wine,我怀疑它能否正常工作,第二个值得尝试的是 dosbox ,一旦我怀疑这也行得通
但如果这些 DLL 是用 .net Framework 编写的,则有一点希望,您可以将它们包装在一个漂亮的 c# 代码中,并在 linux 端使用单声道,不确定这是否允许您导入那些 dll 到 golang,但我也不这么认为
在使用大量技巧让一切正常工作时,您会遇到一些性能问题,只是说
简短的回答是 "no":当您 "load" 动态链接库时,它不仅实际加载(如从文件中读取)而且 链接到 你的 运行 程序的地址 space — 通过 OS 提供的特殊方法(在基于 Linux 的系统上,至少在 x86/amd64 平台是一个外部进程;在 Windows 上,它是一个内核设施,AFAIK)。
换句话说,加载一个动态链接库涉及相当多的复杂性。
另一个复杂的问题是,DLL 是否是 "self-contained" 在某种意义上它只包含 "pure" 函数——这些函数只对它们的输入数据执行计算以提供它们的输出数据,——或者它们调用到操作系统以对文件执行 I/O 等活动。
操作系统为 运行 进程提供执行此类活动的方式在 Windows 和 Linux 之间截然不同。
我能想到的最后一个复杂问题是这个库对其他库的依赖。
如果库的代码是用 C 或 C++ 编写的,它很可能取决于编译库的编译器使用的 C 库(在 Windows 上,通常是 MSVCRxx.DLL
的东西)。 (一个简单的例子是在库代码中调用 malloc()
或 printf()
或类似的东西。)
所有这些意味着为 Windows 在 Windows 上编写的大部分 DLL 都依赖于 Windows 以及与用于构建该库的编译器关联的 C 或 C++ 标准库.
更不用说 Windows DLL 为其模块使用 PE(可移植可执行文件)格式,而 GNU/Linux-based 系统为其共享对象文件原生使用 ELF 格式。
我们的供应商提供了可在 Windows 上运行的 DLL。是否可以使用 Go 加载自定义 xxx.dll 文件并在 Linux 中使用其功能?
恐怕不是,因为 windows DLL 与 Linux 共享对象执行不同的内核调用,两者都有这个奇特的系统库对象名称
但是,如果您需要 运行 windows linux 上的本机应用程序,我建议您尝试一下 Wine,我怀疑它能否正常工作,第二个值得尝试的是 dosbox ,一旦我怀疑这也行得通
但如果这些 DLL 是用 .net Framework 编写的,则有一点希望,您可以将它们包装在一个漂亮的 c# 代码中,并在 linux 端使用单声道,不确定这是否允许您导入那些 dll 到 golang,但我也不这么认为
在使用大量技巧让一切正常工作时,您会遇到一些性能问题,只是说
简短的回答是 "no":当您 "load" 动态链接库时,它不仅实际加载(如从文件中读取)而且 链接到 你的 运行 程序的地址 space — 通过 OS 提供的特殊方法(在基于 Linux 的系统上,至少在 x86/amd64 平台是一个外部进程;在 Windows 上,它是一个内核设施,AFAIK)。 换句话说,加载一个动态链接库涉及相当多的复杂性。
另一个复杂的问题是,DLL 是否是 "self-contained" 在某种意义上它只包含 "pure" 函数——这些函数只对它们的输入数据执行计算以提供它们的输出数据,——或者它们调用到操作系统以对文件执行 I/O 等活动。 操作系统为 运行 进程提供执行此类活动的方式在 Windows 和 Linux 之间截然不同。
我能想到的最后一个复杂问题是这个库对其他库的依赖。
如果库的代码是用 C 或 C++ 编写的,它很可能取决于编译库的编译器使用的 C 库(在 Windows 上,通常是 MSVCRxx.DLL
的东西)。 (一个简单的例子是在库代码中调用 malloc()
或 printf()
或类似的东西。)
所有这些意味着为 Windows 在 Windows 上编写的大部分 DLL 都依赖于 Windows 以及与用于构建该库的编译器关联的 C 或 C++ 标准库.
更不用说 Windows DLL 为其模块使用 PE(可移植可执行文件)格式,而 GNU/Linux-based 系统为其共享对象文件原生使用 ELF 格式。