在添加Microsoft.Bcl.Async包后,为什么需要向app.config文件中添加“bindingRedirect”?

54

我想知道为什么在安装了Microsoft.Bcl.Async后,nuget会向我的应用程序的app.config文件添加以下代码:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-2.5.19.0" newVersion="2.5.19.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-2.5.19.0" newVersion="2.5.19.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

如果我从配置中删除此XML元素,该应用程序将无法正常工作。

据我所理解,我们可以使用bindingRedirect在编译EXE时使用的程序集版本不见的情况下,加载较新或较旧的程序集版本。然而,我正在使用精确版本2.5.19.0,那我为什么需要重定向?

我的dll版本

为什么我需要这个bindingRedirect?

2个回答

44
< p > 组件 Microsoft.Threading.TasksMicrosoft.Threading.Tasks.Extensions 仍然引用System.RuntimeSystem.Threading.Tasks的v1.5.11.0版本。

如果没有bindingRedirect,则Microsoft.*组件将尝试加载旧版本的System.*组件,这将失败。


1
我有一个类似的情况,重定向的程序集在其他地方没有被使用,但是仍然需要绑定重定向吗?还是我可以断言,如果旧版本的程序集在任何地方都没有被引用,那么绑定重定向就不再需要。 - zinking

11

你的意思是,只要存在版本号在0.0.0.0 到 2.5.19.0之间的旧版,请将该版本替换为新版本2.5.19.0。

假设你的项目中没有可用的旧版本,并且你正在尝试访问它,则会出现错误,如“System.IO.FileLoadException:'Could not load file or assembly"

所以当你的项目正在寻找旧版DLL时,它会简单地将其替换为可用的新版。


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