如何通过查看转储文件找到无法加载的程序集?

How do I find which assembly could not be loaded by looking at the dump file?

我在分析我的转储文件时看到了这个:

0:000> !pe
Exception object: 0000000000ec2228
Exception type:   System.IO.FileNotFoundException
Message:          Could not load file or assembly 'MyTest.exe' or one of its dependencies. The system cannot find the file specified.
InnerException:   <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80070002

如何找出无法加载的程序集?我所拥有的只是这个转储文件,并且自事件发生以来问题已经解决,因此该应用目前 运行 正常。

我建议使用 DependencyWalker 找出需要哪些程序集并将其与已加载程序集列表 (lm) 进行比较。

不幸的是,FileNotFoundException 在细节方面不是很有帮助。

请注意,可能有很多原因导致未解决的依赖关系(此列表不保证完整):

  • DLL 不存在(显而易见)
  • 加载 DLL 需要特殊权限(检查 NTFS 访问权限或运行程序作为管理员)
  • 该应用程序 运行 来自被认为不受信任的位置的网络共享
  • DLL 的位数不匹配(如果这不会导致 BadImageFormatException
  • 病毒扫描程序正在阻止对文件的访问

您可以尝试获取更多信息

  • !gle 获取有关上一个错误的详细信息。这是一个本机函数,因此它可能会提供有关 .NET 异常发生之前出现的问题的更多见解。
  • 查看出现问题的机器上的 Windows 事件日志。如果是权限问题,您可以在那里找到信息
  • 查看 | 的输出,看看它是否是来自网络共享的 运行
  • 如果问题可重现,请使用Fusion Log Viewer [Stack Overflow] / [MSDN]找出问题所在
  • 如果问题可重现,请使用 Process Monitor to diagnose, add a filter for your application's executable name. Save the results as XML and push it through ProcMon Analyzer(免责声明:我编写的免费工具)
  • 查看内部异常 - 但在您的情况下没有任何异常