Golang从C或Delphi生成多个Windows DLL的方法

Golang从C或Delphi生成多个Windows DLL的方法 我考虑使用Go来创建Windows DLL(主要供Delphi程序调用),在搜索网络时看到有说法称一次只能加载一个Go DLL!(例如这里https://github.com/z505/goDLL)。我找不到关于这个问题的更新信息——现在还是这种情况吗?如果是的话,这是否仅限于Windows平台?

谢谢

2 回复

我能否在其他地方获得关于这个问题的明确答案(这不太适合在Stack Overflow上提问)?我已经仔细查阅了文档,但能找到的关于构建模式的唯一参考资料还是2016年的。我想使用这个功能的一个例子是用于Excel XLLs——这将是C++的一个很好的替代方案。

更多关于Golang从C或Delphi生成多个Windows DLL的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,目前在使用Go语言生成Windows DLL时,仍然存在一次只能加载一个Go DLL的限制。这主要是因为Go运行时(runtime)的初始化机制和全局状态管理方式导致的。具体原因如下:

  1. Go运行时的单例性质:Go运行时(包括调度器、垃圾回收器等)在进程级别是全局性的。当第一个Go DLL被加载时,运行时会被初始化并占用一些全局资源(如线程池、内存管理等)。如果尝试加载第二个Go DLL,可能会因为运行时重复初始化或资源冲突而导致崩溃或未定义行为。

  2. Windows平台限制:这个问题在Windows上尤为明显,因为Windows的DLL加载机制与Go运行时的设计不完全兼容。在其他平台(如Linux)上,通过共享库(.so)可能也有类似问题,但Windows上的限制更为严格。

  3. 官方支持状态:Go官方对生成DLL的支持有限,尤其是在多DLL场景下。虽然可以通过-buildmode=c-shared编译生成DLL,但多个DLL同时加载的用例并非设计目标。

示例代码和编译方法: 以下是一个简单的Go函数,导出为DLL供外部调用(如Delphi):

// main.go
package main

import "C"

//export Add
func Add(a, b int) int {
    return a + b
}

func main() {
    // 空main函数,用于编译DLL
}

编译命令:

go build -buildmode=c-shared -o mylib.dll main.go

在Delphi中调用示例:

function Add(a, b: Integer): Integer; stdcall; external 'mylib.dll';

重要注意事项

  • 如果您的Delphi程序需要加载多个Go DLL,建议将功能合并到一个DLL中,通过不同的导出函数来区分。
  • 如果必须使用多个DLL,可以考虑通过进程间通信(如命名管道、Socket)来隔离Go运行时。

总之,目前在生产环境中应避免在同一个进程中加载多个Go编译的DLL,尤其是在Windows平台上。这个限制不是Go版本的问题,而是运行时设计的基本约束。

回到顶部