传递依赖导致相同DLL的冲突版本

时间:2012-07-04 21:23:30

标签: 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只是二进制格式(来源无法访问),是否可以完成?

换句话说,有一种方法可以让Project B和X在Project A中一起使用时各自使用自己的依赖项而不会引起冲突。

注意:我意识到理想情况下我根本不应该有这个问题,但是由于对外部库的依赖扩展,这将是一个不可避免的副作用。所以我想知道它应该如何最好地处理它。

1 个答案:

答案 0 :(得分:4)

Stack Overflow上有很多类似的问题。 对于例如Referencing 2 different versions of log4net in the same solution

要点:

  1. 确保在包含主可执行文件的文件夹中分别在文件夹1.0和2.0中部署程序集C.
  2. 更改app.config文件并包含以下内容:
  3.  <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的公钥标记

    如果C的v1.0和v2.0有不同的公钥(尽管理想情况下它们不应该),那么请包含两个dependentAssembly标签。