Golang,在Linux中加载Windows DLL

Golang,在Linux中加载Windows DLL,linux,go,dll,system-calls,Linux,Go,Dll,System Calls,我们的供应商提供在Windows上工作的DLL。这是否可以加载自定义的xxx.dll文件,并使用Go在Linux中使用其功能 像这样:恐怕不是因为windows DLL与Linux共享对象进行不同的内核调用,它们都有这个别致的系统库对象名称 但如果你需要在linux上运行windows本机应用程序,我建议你试试Wine,我怀疑它是否正常工作,第二个值得一试的是dosbox,一旦我怀疑它是否正常工作 但如果这些DLL是在.net framework中编写的,您可以将它们封装在一个漂亮的c#代码中,

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


像这样:

恐怕不是因为windows DLL与Linux共享对象进行不同的内核调用,它们都有这个别致的系统库对象名称

但如果你需要在linux上运行windows本机应用程序,我建议你试试Wine,我怀疑它是否正常工作,第二个值得一试的是dosbox,一旦我怀疑它是否正常工作

但如果这些DLL是在.net framework中编写的,您可以将它们封装在一个漂亮的c#代码中,并在linux端使用mono,但不确定这是否能够将这些DLL导入golang,但我也不这么认为

在这种情况下,如果你想让所有的东西都正常工作,你会遇到一些性能问题,只需说一句

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

另一个复杂的问题是,DLL是否是“自包含的”,即它是否只包含“纯”函数(仅对输入数据执行计算以提供输出数据),或者它们是否调用操作系统来执行诸如文件I/O之类的活动。 操作系统为正在运行的进程提供执行这些活动的方式在Windows和Linux之间有很大的不同

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

这意味着在Windows上为Windows编写的DLL大部分依赖于Windows和与用于构建该库的编译器相关的C或C++标准库。


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

您不能在Linux上使用DLL,它们仅限于Windows。您可以使用Wine,它模拟Windows并可以运行为Windows编写的代码。