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

问题描述:

我有一个类库引用特定的第三方DLL。 此DLL经常更改版本,但在同一主版本中始终向后兼容。我的类库使用特定类型的DLL,并执行这些第三方DLL中包含的不同方法。运行时抛出找不到的方法 - 引用程序集版本不匹配

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

  1. 如何确保我可以使用与编译时最初使用的引用程序集不同的版本?我的运行时现在载入一个较高次要版本的DLL,但是会抛出一个'未找到方法'异常。我已经删除了标签,并试图执行Assembly.Load来模拟指定较新的DLL时的任何行为,但都产生相同的结果;找不到方法。

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

如果您的供应商打破binary code compatibility的机会,你不能影响某人正在做的有没有简单的解决这个问题。 Late binding将是C#中使用reflectiondynamic来解决这个问题的一种解决方法,但它会带来运行时性能的代价以及代码复杂度的极大增加。


如果你设置无论如何要建立这个集成层,你就必须为所有三个版本的代码覆盖它们和Adapter之间的已知排列可能是一个很好的设计模式,开始寻找到。您将确保来自外部库的差异和实体不会从集成层溢出到您自己的业务逻辑中,因此需要很多转换逻辑才能将脆弱的库与其他代码隔离开来。类型,方法,签名,行为和异常等方面的差异将不得不被封装和封闭。

您还需要重新设计您的应用程序或表示层,以取决于这个敌对库来处理相应的差异,并使其仅依赖于您自己的包装。

您的集成测试将不得不针对供应商库的所有三个版本持续执行,可能会在您每次检入代码库时都执行,因此您有足够的保护和敏捷性向前迈进。由于供应商一直在处理库的代码,因此必须分配足够的时间来维持兼容性层的持续维护。