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

Runtime throws method not found - referenced assembly version mismatch

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

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

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

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

如果您的供应商有可能破坏 binary code compatibility and you cannot influence what one is doing there is no simple solution to this problem. Late binding would be one of the workarounds to deal with this in C# using reflection or dynamic,但这将伴随 运行 时间性能的成本和代码复杂性的极大增加。


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

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

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