为了让正在将软件部署到生产环境的技术人员更轻松地进行故障排除,我希望我们的 Windows 服务能够记录在运行时无法加载/定位的任何DLL服务何时开始。没什么好看的,只是:
对于显式加载的DLL(例如使用LoadLibrary()
),这很容易。不幸的是,我不知道如何为应用程序启动时自动加载的DLL(即隐式加载的DLL)执行此操作。
换句话说,如何检测在运行时静态加载的DLL?这甚至可能吗?
非常感谢您提供的任何指导!
DumpBin.exe /Dependents c:\Path\To\Application.exe
为了让部署团队尽可能简单,我曾希望向应用程序的事件日志MyWindowsService.log
写一个明确的消息(毕竟,这是他们寻找所有其他消息)...但是对于Mark Segal来说,创建了 Windows事件日志条目:
Faulting application name: MyWindowsService.exe, version: 2.7.4.1, time stamp: 0x55673caa
Faulting module name: ImplicitlyLoadedLibrary.dll, version: 6.3.9600.17736, time stamp: 0x550f42c2
Exception code: 0xc0000135
Fault offset: 0x0009d4f2
Faulting process id: 0x168c
Faulting application start time: 0x01d0997fc49e50fe
Faulting application path: C:\Program Files (x86)\CompanyName\ApplicationName\MyWindowsService.exe
Faulting module path: ImplicitlyLoadedLibrary.dll
Report Id: 024adcd5-0573-11e5-830a-6c198fb1a83d
Faulting package full name:
Faulting package-relative application ID:
对于任何感兴趣的人Exception code: 0xc0000135
都意味着:
未找到依赖的dll
最初的意图是:
虽然我可以实现一种全新的加载机制(即思考插件架构),但这远远超出了我想要完成的范围。
从目前为止的答案来看,它似乎不可能显示1.
或2.
。
答案 0 :(得分:2)
一种可能性是使您当前的服务逻辑成为单独的DLL s ,从驱动程序 d 加载。然后在 d 中,在加载 s 之前,动态加载 s 依赖的DLL。在过去,您可以通过Resource Kit中的depends
工具Dependency Walker找到该集合(我认为它是);现在,它显然是通过its own web page分发的。
请注意,当加载DLL时,无论加载机制如何,都会加载它。因此,当 d 随后加载 s 时,将满足其所有DLL依赖性。包括静态的。