在web.config文件的configuration>runtime>assemblyBinding节点中生成的条目是什么意思/原因?

65

我注意到我的web.config文件中有这个部分已经有一段时间了,现在我正试图理解它的确切用途:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

因此,第一项似乎是说:

System.Web.Helpers是具有公共密钥令牌31bf3856ad364e35的依赖程序集的名称。将版本1.0.0.0到2.0.0.0重定向到版本2.0.0.0。

我最好的猜测是,它意味着在ASP.NET运行时上下文中执行依赖于指定名称的程序集并且该程序集的版本在指定范围内的任何代码都会像使用指定版本和指定公钥编译的代码一样执行。

这是否意味着如果我有一个Web项目依赖于一个类库,并且该类库引用了一个具有bindingRedirect的旧版本程序集,那么代码将执行为如果它是针对较新版本编译的吗?

1个回答

42
如果我的Web项目依赖于一个类库,而该类库引用了一个旧版本的程序集,并且该程序集有一个bindingRedirect,这是否意味着代码将执行为针对更新版本编译的代码?
你理解得很正确(我只会说“...代码将执行为引用较新版本的代码”),请参见http://msdn.microsoft.com/en-us/library/7wd6ex19%28v=vs.110%29.aspx “当您针对一个特定版本的强命名程序集构建.NET Framework应用程序时,应用程序在运行时使用该程序集的那个版本。但是,有时您可能希望应用程序运行针对更高版本的程序集。”

谢谢,这就是我希望得到的信息。你觉得你理解得足够深入,以至于你的回答是权威的吗?(请不要误解我的意思) - Aaron Anodide
1
@AaronAnodide:不,我不认为我的回答是权威的。那只是我理解文档的方式,我已经用它类似...三次。别担心,我没有误解你的意思;-) - jbl
4
没错,你们说得对,我使用它来达到同样的目的;例如,假设我有一个名为libA.dll的库和另一个名为libB.dll的库。我的libA.dll版本是针对libB.dll 1.0编译的。我已经使用更新的libB.dll(比如1.5)更新了我的应用程序,但libA.dll不再工作。我会使用这个功能来指示运行时让libA.dll能够与更新的libB.dll一起工作(另一个或者更好的选择是,如果我有libA.dll的源代码,就可以将其编译成新版本的libB.dll)。 - Chintana Meegamarachchi
2
当您使用长时间失去源代码的传统代码库时,这是一个绝佳的功能和救星。 - Chintana Meegamarachchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接