假设 2 年前,我编写了一个 .NET 类库,比如mylib.dll
,它严重依赖于一个外部库,比如foo.dll
,它是开源的、MIT 许可的(这是相关的,请继续阅读)。
许多客户使用我的库以及它的依赖程序集。包裹mylib.dll
与foo.dll
.
日子一天天过去,创建者foo.dll
破坏了他们的 API,现在他们部署了一个新版本的库。这个新版本包含了旧版本中包含的大部分类型,但其中一些方法丢失或更改。
问题
一些潜在的消费者已经foo.dll
在他们的应用程序中使用它的新版本,供他们自己使用。当我提供它们时mylib.dll
,他们不能使用它。他们甚至无法成功构建,因为mylib.dll
想要旧版本的foo.dll
旧方法和签名。
如何克服这个问题?
我想要一个前向兼容的解决方案,这样就不会再次提出这个问题。所以我想了几件事:
- 更新我的源代码以使用新版本的
foo.dll
. 但这需要大量的工作和时间。此外,这不是向前兼容的,因为有一天这个问题可能会再次出现。 - 由于我有确切版本的来源
foo.dll
,也许我可以轻松更改其名称空间并重建整个事物。这样我就可以享受我自己的版本了foo.dll
,这是合法的,因为它的许可证是 MIT。我可以命名修改后的程序集mylib.foo.dll
或类似的名称。我什至可以将整个东西合并ILMerge
到类似mylib.merged.dll
. - 重新设计
mylib.dll
,以便将所需的功能foo.dll
分离为接口和实现。在工程方面,这是最优雅的解决方案。就时间而言,这是一场灾难,因此不能被视为真正的解决方案。
我的问题
为了完成上面的#2,有没有一种改变给定源代码命名空间的捷径?