这种绑定重定向是多余的吗?

时间:2014-01-27 12:14:05

标签: .net redirect clr versioning .net-assembly

我注意到在我的一些项目中有一些绑定重定向,它重定向到相同的“版本”号。

例如:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Reactive" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.10621.0" newVersion="1.0.10621.0" />
      </dependentAssembly>
    </assemblyBinding>
</runtime>

项目中充斥着这些重定向。

它们是多余的(因此可以删除它)吗?

我不确定他们是如何进入我的项目的。我自己没有打字,它是怎么到达那里的?

1 个答案:

答案 0 :(得分:1)

当两个或多个单独构建的程序集引用同一个库时,绑定重定向很重要。例如,如果您的项目和外部nuget库都使用反应。您可以进入这样的情况:不同的组合都使用不同版本的RX,这将导致事情中断。

这个特殊的绑定重定向说的是:

  

如果程序集请求任何版本的System.Reactive小于1.0.10621.0,只需给它1.0.10621.0版本

这里的绑定重定向是为了确保所有以前版本的RX都绑定到您在应用程序中使用的版本。这可以防止绑定错误。

它很可能是一个引用RX的nuget包,它自动添加了这个,因为RX是一个相当常见的库,因此很可能被另一个程序集使用。

使用库进行此类操作存在一些问题,

  • 它假定绑定重定向中的版本是最新版本(在这种情况下,如果另一个库使用RX 1.1的东西仍会破坏)
  • 如果发生了重大更改,那么期望旧版本RX的程序集可能会因为给出新的
  • 而中断

我不是自动添加绑定重定向的忠实粉丝,但它可以隐藏人们在使用包时遇到的一些常见问题。

TLDR;

如果您可以删除重定向,答案可能是肯定的,除非您有不同库使用的多个RX版本。