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

New*_*ian 10 .net c# 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在项目A中一起使用时使用它们自己的依赖项而不会引起冲突.

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

Ami*_*tal 5

关于堆栈溢出有很多类似的问题。例如,在同一解决方案中引用2个不同版本的log4net

摘要:

  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>
Run Code Online (Sandbox Code Playgroud)

您可以使用sn -T C.dll获取C的公钥令牌

如果C的v1.0和v2.0具有不同的公钥(尽管理想情况下不应该),则应包括两个dependentAssembly标签。