【问题标题】:Runtime throws method not found - referenced assembly version mismatch未找到运行时抛出方法 - 引用的程序集版本不匹配
【发布时间】:2017-09-29 07:14:37
【问题描述】:

我有一个引用特定第 3 方 DLL 的类库。 此 DLL 经常更改版本,但始终在同一主要版本中向后兼容。我的类库使用特定类型的 DLL,并执行这些第 3 方 DLL 中包含的不同方法。

我必须在这里重新考虑应用程序的设计,因为我目前有一个问题,但一旦第三方 DLL 有多个主要版本(主要版本有限, 3 具体)。

  1. 如何确保可以使用与最初在编译时使用的程序集不同的版本?我的运行时现在加载到一个更高次要版本的 DLL 中,但它会引发 'Method not found' 异常。我删除了标签,并尝试执行 Assembly.Load 以模拟指定较新 DLL 时的任何行为,但两者都产生相同的结果;找不到方法。

  2. 在单个 DLL 中支持三个主要 (!) 版本的引用 dll 的最佳方法是什么?由于类库的使用性质,不允许用户选择正确的版本或构建 3 个不同的 DLL。

【问题讨论】:

    标签: c# .net assemblies


    【解决方案1】:

    如果您的供应商有可能破坏binary code compatibility,并且您无法影响供应商的行为,则没有简单的解决方案可以解决此问题。 Late binding 是在 C# 中使用 reflectiondynamic 处理此问题的解决方法之一,但它会以运行时性能为代价并极大地增加代码的复杂性。


    如果您无论如何都准备构建此集成层,则必须为所有三个版本编写代码以涵盖它们之间的已知排列,Adapter 可能是开始研究的一个很好的设计模式。您将确保来自外部库的差异和实体不会从集成层溢出到您自己的业务逻辑中,因此需要大量转换逻辑来将脆弱的库与其余代码隔离开来。类型、方法、签名、行为和抛出的异常等差异必须封装和限制。

    您还必须重新设计依赖此恶意库的应用程序或表示层,以相应地处理差异并使其仅依赖于您自己的包装器。

    您的集成测试必须在您每次将代码签入存储库时针对供应商库的所有三个版本不断执行,这样您就有足够的保护和敏捷性继续前进。而且由于供应商一直在处理库的代码,因此您必须分配足够的时间来持续维护和支持兼容性层。

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多