为啥在添加 Microsoft.Bcl.Async 包后在 app.config 文件中添加了“bindingRedirect”?

Posted

技术标签:

【中文标题】为啥在添加 Microsoft.Bcl.Async 包后在 app.config 文件中添加了“bindingRedirect”?【英文标题】:Why is a "bindingRedirect" added to the app.config file after adding the Microsoft.Bcl.Async package?为什么在添加 Microsoft.Bcl.Async 包后在 app.config 文件中添加了“bindingRedirect”? 【发布时间】:2013-05-30 23:58:15 【问题描述】:

我想知道为什么 nuget 在安装 Microsoft.Bcl.Async 后将以下代码添加到我的应用程序 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 的版本,那我为什么需要重定向呢?

为什么我需要这个bindingRedirect

【问题讨论】:

【参考方案1】:

您只是说,只要有 0.0.0.0 到 2.5.19.0 之间的旧版本,请将该版本替换为 2.5.19.0 的新版本

假设您的项目中没有可用的旧版本并且您正在尝试访问它,那么您最终会遇到类似“System.IO.FileLoadException:'无法加载文件或程序集”这样的错误

因此,当您的项目正在寻找该 DLL 的旧版本时,它会简单地将其替换为可用的新版本

【讨论】:

【参考方案2】:

程序集Microsoft.Threading.TasksMicrosoft.Threading.Tasks.Extensions 仍然引用System.RuntimeSystem.Threading.Tasks 的v1.5.11.0。

没有bindingRedirectMicrosoft.* 程序集将尝试加载旧版本的System.* 程序集,这会失败。

【讨论】:

我有类似的情况,重定向的程序集根本没有在其他地方使用,但仍然需要绑定重定向? -- 或者我可以断言,如果旧版本的程序集没有在任何地方引用,那么根本不需要绑定重定向。

以上是关于为啥在添加 Microsoft.Bcl.Async 包后在 app.config 文件中添加了“bindingRedirect”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET 4.0 中使用 Microsoft.Bcl.Async 支持 TransactionScope 中的异步方法? [复制]

如何在.net4.0中使用.net4.5的async/await实现异步

如何在没有nuget.exe或Visual Studio扩展的情况下下载Nuget包?

为啥我不能在颤振中添加包

为啥在 searchBar 和 tableview 之间添加空格?

为啥在 JavaScript 中将全局变量添加到窗口对象?