在运行时,如果引用的程序集无法加载,例如“强名称验证失败”(因为它是测试签名的),有没有办法从另一个真正签名的路径提供替换程序集?
我尝试订阅 AppDomain.CurrentDomain.AssemblyResolve,但它没有被解雇,因为技术上存在“坏”程序集,它只是无法加载。
当无法加载程序集时,是否有一种通用方法来提供后备程序集?
在运行时,如果引用的程序集无法加载,例如“强名称验证失败”(因为它是测试签名的),有没有办法从另一个真正签名的路径提供替换程序集?
我尝试订阅 AppDomain.CurrentDomain.AssemblyResolve,但它没有被解雇,因为技术上存在“坏”程序集,它只是无法加载。
当无法加载程序集时,是否有一种通用方法来提供后备程序集?
什么触发了加载尝试?IOW 你调用 Assembly.Load 还是这是类型解析尝试的结果?如果是后者,您可以尝试使用 AppDomain TypeResolve 事件,如果是前者 - 您可以在调用 Assembly.Load 时添加额外的逻辑。
如果您手动加载程序集,请确保使用 Assembly.Load - 而不是 Assembly.LoadFrom 加载它。根据加载的上下文程序集,类型解析存在细微差别
我认为您可以调用 assembly.LoadFrom 来加载您选择的程序集,而几乎没有安全检查。我们在我们的应用程序开始时使用了很多,因此我们可以更好地处理其他程序集版本更改。
另请查看Assembly.LoadFrom Method (String, Evidence, Byte[], AssemblyHashAlgorithm) 看起来您可以控制传入散列以及散列算法。
看来我想要的不可能了。我决定走另一条路。我们将不得不修改构建系统以在编译时有条件地链接到签名的二进制文件而不是测试签名的二进制文件。
不过还是谢谢大家的建议!
如果应用程序无法找到程序集,则有一种标准方法:
// register on assembly resolve exception
AppDomain.CurrentDomain.AssemblyResolve += ResolveEventHandler;
// try to load the assembly yourself
private static Assembly ResolveEventHandler(object sender, ResolveEventArgs args)
{
return Assembly.Load(some_location);
}