.NET 世界中管理导致版本冲突的传递依赖项的最佳实践是什么?
详情: 项目 A 依赖于项目 B,而项目 B 又依赖于库 C
还有
项目 A 还依赖于项目 X,后者依赖于库 C 的不同且(可能)不兼容的版本。
A->B->Cv1.0
&
A->X->Cv2.0
其中
Cv1.0 <> Cv2.0
有没有办法让它工作?
可以不使用 GAC 来完成吗?
即使 B 和 X 只是二进制格式(无法访问源代码)也能做到吗?
换句话说,有没有一种方法可以让项目 B 和 X 在项目 A 中一起使用时各自使用它们自己的依赖项,而不会引起冲突。
注意:我意识到理想情况下我根本不应该遇到这个问题,但随着对外部库的依赖不断扩大,这将是一个不可避免的副作用。所以我想知道应该如何最好地处理它。
最佳答案
Stack Overflow 上有很多类似的问题。 例如Referencing 2 different versions of log4net in the same solution
总结:
- 确保将程序集 C 分别部署在包含主要可执行文件的文件夹中的文件夹 1.0 和 2.0 中。
- 更改 app.config 文件并包含如下内容:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="C" publicKeyToken="C's public key token" /> <codeBase version="version string for C1.0 e.g. 1.0.0.0" href="1.0\C.dll" /> <codeBase version="version string for C2.0 e.g. 2.0.0.0" href="2.0\C.dll" /> </assemblyIdentity> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
你可以使用 sn -T C.dll 获取 C 的公钥 token
如果 C 的 v1.0 和 v2.0 具有不同的公钥(尽管理想情况下它们不应该),则包含两个 dependentAssembly 标记。
关于c# - 传递依赖导致同一 DLL 的版本冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11335577/