如果您在慢速硬盘上运行具有Windows DLL依赖项的Go应用程序,有时会出现Windows加载这些DLL的时间过长的情况。如果你把你的go应用程序放到windows服务中,你会遇到严重的问题。特别是在慢速硬盘上,这会导致windows服务超时,服务将无法启动。有没有可能以某种方式将这些DLL静态链接到go应用程序?加载DLL后,一切正常,但需要两次尝试才能使服务运行。但在第一次失败后,Windows不会尝试再次启动该服务,因此我必须自己手动启动该服务。有人有主意吗?
gzszwxb41#
简短的回答是“不”:“DLL”代表“动态链接库”,不可能静态链接DLL。基本上你有两条路可走,我会说:
Windows服务启动的默认超时为30000毫秒;这是 * 很多 *,所以我倾向于认为你的问题是没有加载DLL或至少没有 * 定位 * 和链接它们。通常的做法是双管齐下:
如果您使用LoadLibrary[Ex]加载DLL,则在这些调用时将调用其入口点。考虑到这一点,请尝试在DLL初始化代码中添加一些跟踪。如果所有这些都失败了,请尝试Sysinternals fame的procmon或类似的工具。
LoadLibrary[Ex]
procmon
但请注意,如果问题实际上是处理这些库的初始化,静态链接它们不会给您带来任何好处-也就是说,它们已经链接得很慢了。我还要指出,如果我的猜测是正确的,并且一个或多个yout lib试图访问某些网络资源,解决这个问题的一个简单方法可能是为您的服务实现适当的依赖关系-这样它就只在它所依赖的服务运行时启动(例如网络,DNS等)。
cwtwac6a2#
考虑使用LazyDll来加速代码。
2条答案
按热度按时间gzszwxb41#
简短的回答是“不”:“DLL”代表“动态链接库”,不可能静态链接DLL。
基本上你有两条路可走,我会说:
Windows服务启动的默认超时为30000毫秒;这是 * 很多 *,所以我倾向于认为你的问题是没有加载DLL或至少没有 * 定位 * 和链接它们。
通常的做法是双管齐下:
如果您使用
LoadLibrary[Ex]
加载DLL,则在这些调用时将调用其入口点。考虑到这一点,请尝试在DLL初始化代码中添加一些跟踪。
如果所有这些都失败了,请尝试Sysinternals fame的
procmon
或类似的工具。但请注意,如果问题实际上是处理这些库的初始化,静态链接它们不会给您带来任何好处-也就是说,它们已经链接得很慢了。
我还要指出,如果我的猜测是正确的,并且一个或多个yout lib试图访问某些网络资源,解决这个问题的一个简单方法可能是为您的服务实现适当的依赖关系-这样它就只在它所依赖的服务运行时启动(例如网络,DNS等)。
cwtwac6a2#
考虑使用LazyDll来加速代码。