如果您在慢速硬盘上运行带有 Windows DLL 依赖项的 go 应用程序,有时会发生 Windows 加载这些 dll 的时间过长。
如果您将 go 应用程序放入 Windows 服务中,您会遇到严重的问题。
特别是在慢速硬盘上,这会导致 windows 服务超时,服务无法启动。
是否有可能以某种方式将这些 DLL 静态链接到 go 应用程序?
加载 DLL 后一切正常,但需要两次尝试才能使服务运行。
但是在第一次失败后,Windows不会再尝试启动该服务,所以我只好自己手动启动该服务。
有人有想法吗?
最佳答案
简短的回答是“否”:“DLL”代表“动态链接库”,静态链接 DLL 是不可能的。
基本上你有两条路可以走,我会说:
调试问题。
Windows 服务启动的默认超时时间 为 30000 毫秒;那是很多,所以我倾向于认为 你的问题是它没有加载 DLL 或者至少没有加载 定位并将它们链接起来。
通常的方法是双管齐下:
隔离可能的案例。首先,将您的服务变成 一个简单的(比如控制台)程序,看看它是如何启动的 与冷缓存。如果行为持续存在,它会更简单 比服务调试。
研究您的某些 DLL 是否做了愚蠢的事情 比如在它们的入口函数中执行网络请求 (俗称“DllMain”)。
如果您使用
LoadLibrary[Ex]
加载 DLL, 它们的入口点在这些调用中被调用。考虑到这一点,尝试在您的 DLL初始化代码。
如果所有这些都失败了,试试 Sysinternals 的
procmon
或类似工具。获取/生成这些库的静态构建——然后您将 能够静态链接它们。
但请注意,如果这个问题实际上是有事情要处理的 通过这些库的初始化,静态链接它们 不会给你买任何东西——也就是说,它们已经链接起来很慢。
我还会注意到,如果我在黑暗中拍摄的照片是正确的, 并且一个或多个你的库试图访问一些网络 资源,解决问题的一个简单方法可能是实现 为您的服务提供适当的依赖关系——以便它只启动 当它所依赖的服务正常运行时(例如 网络、DNS 等)。
关于windows - 我可以在构建 Go 程序的同时静态链接一些 DLL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51855473/