c# - 传递依赖导致同一 DLL 的版本冲突

标签 c# .net dll dependency-management transitive-dependency

.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

总结:

  1. 确保将程序集 C 分别部署在包含主要可执行文件的文件夹中的文件夹 1.0 和 2.0 中。
  2. 更改 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/

相关文章:

c# - 需要一个兼容 Mono 的 WinForms 对接库

c# - Xamarin.Forms 命令绑定(bind) TargetInvocationException

.net - Active Directory 是否可以回滚?

.net - TDD和管理

delphi - 将 Windows 主题应用到 Office Com 加载项

c# - 包含多个值的字符串

c# - 为什么 DataContractSerializer 到 StringWriter 会被截断?

c# - 在哪里/如何存储或处理大量自定义异常?

java - 通过一些 JAR 手术修复 Java 类路径问题

c++ - 不同系统上的相同构建