我开发了一个名为 CompanyName.SDK
的功能库,必须将其集成到公司项目 CompanyName.SomeSolution
中。
CompanyName.SDK.dll
必须通过 NuGet 包部署。而 CompanyName.SDK
包又依赖于第三方 NuGet 包。举个好例子,比如说 Unity
。当前依赖于 v3.5.1405-prerelease
版本的 Unity
。
CompanyName.SomeSolution.Project1
依赖于 Unity
的 v2.1.505.2
版本,CompanyName.SomeSolution.Project2
依赖于 Unity
的 v3.0.1304.1
版本。
将 CompanyName.SDK
集成到该解决方案中会增加对 Unity
v3.5.1405-prerelease
版本的依赖。假设 CompanyName.SomeSolution
有一个可运行输出项目 CompanyName.SomeSolution.Application
,它依赖于上述两个项目和 CompanyName.SDK
。
问题在这里开始。所有的 Unity
程序集都没有版本说明符,所有包中的程序集名称都是相同的。而在目标文件夹中,只会有一个版本的 Unity
程序集:v3.5.1405-prerelease
版本,通过 app.config
中的 bindingRedirect
实现。
如何让 Project1
、Project2
和 SDK
代码使用它们编写、编译和测试的确切版本的依赖包?
注1:这里举的只是 Unity
的例子,实际情况要复杂10倍,因为第三方模块依赖于另外的第三方模块,而这些模块又同时拥有3-4个不同的版本。
注意2:我不能将所有软件包升级到它们的最新版本,因为有些软件包具有依赖于另一个软件包的非最新版本的问题。
注意3:假设依赖软件包在版本之间存在重大更改。这就是我提出这个问题的真正问题所在。
注意4:我知道有一个关于“发现同一依赖程序集的不同版本之间的冲突”的问题,但那里的答案并没有解决问题的根源--它们只是隐藏了它。
注意5:那个承诺的“DLL地狱”问题的解决方案到哪里去了?它只是从另一个位置重新出现了。
注意6:如果您认为使用GAC是某种选择,那么请编写逐步指南或给我一些链接。
AppDomain
中加载相同程序集的不同版本是可能的,但这是一个非常丑陋的hack,并且会以微妙的方式破坏。如果您可以将代码分离到不同的进程或至少AppDomains中,这将变得更加容易 - 您只需要维护几个接口库即可。 - Luaan