未找到运行时抛出方法 - 引用的程序集版本不匹配

时间:2017-05-01 20:59:56

标签: c# .net assemblies

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

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

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

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

1 个答案:

答案 0 :(得分:1)

如果您的供应商有可能破坏binary code compatibility并且您无法影响正在做的事情,那么这个问题就没有简单的解决办法。 Late binding是使用reflectiondynamic在C#中处理此问题的解决方法之一,但它会带来运行时性能的代价以及代码复杂性的极大增加

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

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

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