注释
本文特定于 .NET Framework。 它不适用于 .NET 的较新版本实现,包括 .NET 6 及更高版本。
当程序集无法加载时,将 bindingFailure 激活托管调试助手(MDA)。
症状
代码尝试使用静态引用或加载程序方法之一(例如 Assembly.Load 或 Assembly.LoadFrom)加载程序集。 未加载程序集并引发异常FileNotFoundExceptionFileLoadException。
原因
当运行时无法加载程序集时,将发生绑定失败。 绑定失败可能是以下情况之一的结果:
公共语言运行时 (CLR) 找不到请求的程序集。 发生这种情况的原因有很多,例如未安装程序集或未正确配置应用程序以查找程序集。
一个常见问题方案是将类型传递给另一个应用程序域,这要求 CLR 加载包含该类型的程序集在另一个应用程序域中。 如果其他应用程序域与原始应用程序域不同,则运行时可能无法加载程序集。 例如,这两个应用程序域可能具有不同的 BaseDirectory 属性值。
请求的程序集已损坏或不是程序集。
尝试加载程序集的代码没有正确的代码访问安全权限来加载程序集。
用户凭据不提供读取文件所需的权限。
解决方案
第一步是确定 CLR 为何无法绑定到请求的程序集。 运行时可能找不到或能够加载请求的程序集的原因有很多,例如“原因”部分中列出的方案。 建议执行以下操作来消除绑定失败的原因:
使用 MDA 提供
bindingFailure的数据确定原因:运行 Fuslogvw.exe(程序集绑定日志查看器) 读取程序集绑定程序生成的错误日志。
确定程序集是否位于请求的位置。 对于 LoadFrom 和 LoadFile 方法,可以轻松确定请求的位置。 对于 Load 使用程序集标识绑定的方法,必须查找与应用程序域的属性探测路径和全局程序集缓存中的标识匹配的 BaseDirectory 程序集。
根据上述确定解决原因。 可能的解决方法选项如下:
在全局程序集缓存中安装请求的程序集,并调用该程序集。 Load 按标识加载程序集的方法。
将请求的程序集复制到应用程序目录中,并调用 Load 方法以按标识加载程序集。
通过更改 BaseDirectory 属性或添加专用探测路径来重新配置发生绑定失败的应用程序域以包含程序集路径。
更改文件的访问控制列表,以允许登录用户读取该文件。
对运行时的影响
此 MDA 对 CLR 没有影响。 它仅报告有关绑定失败的数据。
输出
MDA 报告无法加载的程序集,包括请求的路径和/或显示名称、绑定上下文、请求加载的应用程序域以及失败的原因。
如果该数据对 CLR 不可用,显示名称或请求的路径可能为空。 如果失败的调用是 Load 方法,则运行时可能无法确定程序集的显示名称。
配置
<mdaConfig>
<assistants>
<bindingFailure />
</assistants>
</mdaConfig>
示例
下面的代码示例演示了可激活此 MDA 的情况:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
// This call attempts to load a nonexistent assembly.
// The call will throw a System.IO.FileNotFound exception
// and cause the activation of the bindingFailure MDA
// if it is registered.
Assembly.Load("NonExistentAssembly");
}
}
}