【发布时间】:2019-01-22 03:22:00
【问题描述】:
如果您在慢速硬盘上运行带有 Windows DLL 依赖项的 go 应用程序,有时会出现 Windows 加载这些 dll 的时间过长。
如果您将 Go 应用程序放入 Windows 服务中,您会遇到严重的问题。
特别是在慢速硬盘上,这会导致 windows 服务超时,服务将无法启动。
是否有可能以某种方式将这些 DLL 静态链接到 go 应用程序?
加载 DLL 后一切正常,但需要两次尝试才能使服务运行。
但是在第一次失败后,Windows 不会再尝试启动服务,所以我必须自己手动启动服务。
有人有想法吗?
【问题讨论】:
-
作为一种解决方法,您可以在注册服务时延长启动超时时间吗?
-
是的,这将是一种解决方法。但是该服务在许多客户机器上运行,我不知道它的潜在副作用:/ 据我所知,您可以在全局范围内而不是针对特定服务进行编辑
-
不过,在超时之前无法加载一些 DLL 似乎有点令人惊讶。有没有办法让我们重现这个?
-
我们在这里讨论的时间范围是什么?您确定问题不在其他地方(例如,您的可执行文件中的故障 - 它也是从磁盘 BTW 加载的,或者在加载自定义 .dll 时)?我不知道您是如何构建可执行文件的,但请检查msdn.microsoft.com/en-us/library/yx9zd12s.aspx(该选项只会在第一次需要时加载 .dll 而不是程序启动)。
-
复制:在服务包装器中使用github.com/shirou/gopsutil:github.com/kardianos/service 如果我从我的源中删除此存储库,该服务将 100% 工作。如果您滚动浏览 gopsutil 源代码,您会发现许多 dll 导入。
标签: windows go dll dllimport static-linking