【问题标题】:How to provide a fallback assembly instead of the one that can't be loaded?如何提供备用程序集而不是无法加载的程序集?
【发布时间】:2009-10-02 03:09:36
【问题描述】:

在运行时,如果引用的程序集无法加载,例如“强名称验证失败”(因为它是经过测试签名的),有没有办法从另一个真正签名的路径提供替换程序集?

我尝试订阅 AppDomain.CurrentDomain.AssemblyResolve,但它没有被触发,因为“坏”程序集在技术上存在,它只是无法加载。

当无法加载程序集时,是否有一种通用的方法来提供后备程序集?

【问题讨论】:

  • 在尝试加载程序集时可以尝试捕获 SecurityException 吗?
  • 我试过了,但我不知道下一步该做什么......我仍然需要以某种方式告诉 CLR 程序集加载器在加载我的程序集时选择正确的依赖项......
  • 如何在应用程序启动时显式加载程序集并处理异常。我以某种方式假设您的程序集是自动加载的。
  • 是的,但即使在我处理了异常之后 - 我仍然如何获得正确的版本来加载?它是静态链接的。嗯,也许我应该在正确的版本上调用 Assembly.Load??
  • 你可能不得不弄乱出版商政策文件......我从来没有,所以我不把这个作为答案。

标签: c# .net reflection assembly-resolution assembly.load


【解决方案1】:

我认为您可以调用 assembly.LoadFrom 来加载您选择的程序集,而无需进行任何安全检查。我们在我们的应用程序开始时经常使用这个,以便我们可以更好地处理其他程序集版本更改。

也请看Assembly.LoadFrom Method (String, Evidence, Byte[], AssemblyHashAlgorithm) 看起来您可以控制传入散列以及散列算法。

【讨论】:

  • 谢谢。我刚刚尝试过,它给了我相同的“强名称验证失败”,尽管我将它指向正确的程序集: var assemblyName = AssemblyName.GetAssemblyName(correctFileName); var assembly = Assembly.Load(assemblyName);我在想这是因为正确的文件名在 app CodeBase 文件夹之外。我想我会离开它并走另一条路......
  • 通过 loadfrom 传递一个文件路径,您可以从任何位置(几乎)加载程序集。
  • 是的,LoadFrom 似乎让我通过了这个。后来我遇到了其他问题,所以我放弃了整个方法,但是是的,这个问题已经解决了。预加载程序集,而不是响应加载失败。谢谢!
【解决方案2】:

是什么触发了加载尝试? IOW 你调用 Assembly.Load 还是这是类型解析尝试的结果?如果是后者,您可以尝试使用 AppDomain TypeResolve 事件,如果是前者 - 您可以在调用 Assembly.Load 时添加额外的逻辑。

如果您手动加载程序集,但请确保使用 Assembly.Load - 而不是 Assembly.LoadFrom 加载它。根据加载的上下文程序集,类型解析存在细微差别

【讨论】:

  • 我不使用 Assembly.Load - 有问题的程序集由编译器链接。每当我开始使用程序集时——我调用 typeof(TypeInAssembly).GetTypes()——这会加载第一个程序集并递归地加载它的无符号引用程序集。 TypeResolve 也没有被提出 :( 还是谢谢。
【解决方案3】:

看起来我想要的东西是不可能的。我决定走另一条路。我们必须修改构建系统以在编译时有条件地链接到签名的二进制文件而不是测试签名的二进制文件。

感谢大家的建议!

【讨论】:

    【解决方案4】:

    有一种标准方法可以在应用程序找不到时找到程序集:

    // 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 2016-07-05
      • 2016-04-09
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多