10

.NET 世界中管理导致版本冲突的传递依赖项的最佳实践是什么?

详细说明:项目 A 依赖于项目 B,而项目 B 又依赖于库 C

项目 A 还依赖于项目 X,项目 X 依赖于库 C 的不同且(可能)不兼容的版本。

A->B->Cv1.0
&
A->X->Cv2.0
其中
Cv1.0 <> Cv2.0

  • 有没有办法使这项工作?

  • 可以在不使用 GAC 的情况下完成吗?

  • 即使 B 和 X 仅是二进制格式(源不可访问),也可以这样做吗?

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

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

4

1 回答 1

5

Stack Overflow 上有很多类似的问题。例如在同一解决方案中引用 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>

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

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

于 2012-07-05T08:17:48.607 回答