使用绑定重定向升级两个项目之一

Upgrade one of two projects using binding redirects

我找不到特定于这种情况的信息,因为所有信息都是关于升级整个解决方案而不是一次升级一个项目

实际情况是我想在log4net中使用udp appender并且我正在将log4net版本从1.2.10.0升级到1.2.15.0来这样做。但我也有一个旧版本的 nHibernate 引用和使用版本 1.2.10.0 的 API。

我想通过只升级大型系统的一小部分来降低新版本在生产使用中出现问题的风险。所以我只会在特定的服务中引用新版本,而共享组件会引用旧版本。

例子

库项目 A(nhiberate)通过强名称引用 v1

库项目 B 通过弱名称引用 v1(即 "log4net")

申请项目C:

应用程序项目 D 弱引用项目 B 和 v1。

然后在项目 C 中,我希望所有未强命名的 log4net 使用都使用 v2,以及任何更具体的参考来检查配置中的绑定重定向,然后要么使用存在的那个,要么失败。

实际情况是项目 B 也使用了重定向,所以我没有从升级中受益。

项目 B 的程序集中必须有一些元数据 "prefers" 在可用时使用 v1。是这样吗?是否可以在项目 C 引用 v2 时强制项目 B 使用 v2(同时不会导致项目 D 失败)?

示例配置:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
        <codeBase version="1.2.10.0" href="log4net-1.2.10.0.dll" />
      </dependentAssembly>
    </assemblyBinding>
</runtime>

ildasm.exe 告诉我程序集在清单中包含特定的版本信息。创建示例解决方案并显示问题也很容易。

https://msdn.microsoft.com/en-us/library/51ket42z(v=vs.110).aspx

解释说

applications run only with the versions they were built and tested with, unless overridden by explicit version policy in configuration files

我希望元数据可以在项目 C 使用的 dll 副本中编辑,而不是在项目 D 使用的副本中编辑。

然而,这有点复杂。

出于我的目的,从头开始编写一个没有 log4net 1.2.10.0

中的 ip v4/v6 地址错误的 udp appender 可能也很容易

我选择的方法是升级整个系统以使用较新的版本,并在低风险生产环境中进行更改。