程序集加载问题很难调试,因为在处理托管代码和本机代码时至少有两层。
- 当可执行文件启动时,本机加载程序必须找到该文件,将其连同所有相关的 DLL 加载到内存中以使其运行。
- 本机加载程序查看程序集清单以确定此信息,然后简单地搜索所有 DLL 并将它们加载到内存中(按顺序)。
- 您可以使用 WINDBG 轻松查看此过程,并指向一个 EXE 并从 Windbg 运行它。正在加载的模块列表是工作中的本机加载程序。
- 如果依赖项是 .NET 托管代码程序集,则本机加载程序将加载请求直接传输到托管加载程序,称为“Fusion”。
- 您可以轻松设置 FusionLOG 查看器以查看发生了什么http://msdn.microsoft.com/en-us/library/vstudio/e74a18c4%28v=vs.100%29.aspx
- 通过 WINDBG for Native 或 Fusion Log View for Managed 代码很容易发现托管层或托管层内的加载失败。
关于托管 DLL 加载的一些提示: 如果程序集包含对未包含在该程序集中的 dll 的引用,则会遵循严格的“探测”顺序来查找 dll。将至少尝试 3 次在不同位置(例如在程序集、程序根路径和 GAC 中)找到 DLL。如果这三个尝试都失败了,加载将在此时停止并且程序将不会运行。当这种情况发生时,它通常被认为是系统级的环境问题;然而,实际上这是一个编程问题,因为除非系统管理员完全了解先决条件,否则他们无法猜测这些东西。如果您是包含其他依赖 dll 的程序员,则应始终考虑是否将它们放入程序集中以阻止此问题。否则你,
您可能会说,我被另一个部门告知使用此 dll,我不知道其他依赖项是什么!这不是借口,因为有诸如 ILDASM 之类的优秀工具,甚至托管代码 Dependency walkers 会告诉您所需的一切。打包这些“其他”dll 的最佳方法是将它们简单地包含在您的程序集中。