绑定重定向地狱

时间:2017-12-07 23:08:41

标签: c# wpf .net-standard assembly-binding-redirect

我有一个.Net Framework 4.6.1 WPF项目,该项目引用了多个.Net Standard 2.0程序集。这些程序集中的每一个都有自己的一个或两个依赖项,从NuGet引入。 在Visual Studio内部,一切正常并且运行正常。但是,当我第一次尝试发布应用程序并运行它(在同一台机器上)时,我得到了这个令人讨厌的异常:

  

无法加载文件或程序集System.Runtime,Version = 4.1.2.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其中一个依赖项。系统找不到指定的文件。

经过几天拉头发后,我终于发现将以下绑定重定向添加到我项目的App.config中解决了问题

<dependentAssembly>
  <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>

至少,它将问题移到了System.ObjectModel。然后在我添加了绑定重定向后,我收到了System.Collections的错误,依此类推......不久之后,我的App.config看起来像这样:

<dependentAssembly>
  <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.ObjectModel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Collections" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Reflection.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Threading" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Linq" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Globalization" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Collections.Concurrent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Net.Requests" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Net.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Text.RegularExpressions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Runtime.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Net.WebHeaderCollection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
  <assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
  <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>

最近,我将ServiceStack.Client.Core NuGet包添加到我的一个.Net Standard程序集中,并添加了一些调用Web服务的代码。同样,Visual Studio中的一切都很好用,但是当我去发布应用程序然后运行时,每当应用程序试图调用我的Web服务时,我就会再次看到这些错误。我开始添加绑定重定向,直到我遇到一个看起来需要两个不同版本的程序集:

  

无法加载文件或程序集“System.IO.Compression,Version = 4.2.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089&#39;或其中一个依赖项。系统找不到指定的文件

具有以下内部异常:

  

无法加载文件或程序集“System.IO.Compression,Version = 4.1.1.0,Culture = neutral,PublicKeyToken = b77a5c561934e089&#39;或其中一个依赖项。系统找不到指定的文件

如果我尝试为4.2.0.0添加绑定重定向,则外部异常消失,但我仍然看到4.1.1.0的异常。我尝试过几乎我能想到的每种方式为4.1.1.0添加第二个绑定重定向(重定向到4.1.1.0,重定向到4.2.0.0,在<dependentAssembly><dependentAssembly> }标签,在其自己的4.1.1.0标签中,只有<RestoreProjectStyle>PackageReference</RestoreProjectStyle>重定向...但无论我做什么,内部异常仍然存在。是的,在你问之前,我知道publicKeyToken这个集会与其他集会不同。

作为补充说明,我发现了一些StackOverflow帖子,其中提到将<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>和/或PackageReference添加到我的.csproj将解决这些问题。我试过这个,但它绝对没有任何意义。此外,我的所有项目都使用packages.config System.IO.Compression

所以,我有两个问题:

  1. 我如何处理这个4.2.0.0 4.1.1.0 / .Net Standard依赖问题?
  2. 对这些问题有更好的长期解决方案吗?我觉得非常难以理解,无论何时我将NuGet包添加到我的System.X库之一,我都会遇到一堆运行时错误,除非我为每一个struct GlobalData { var email: String? = nil } var globalData = GlobalData() 依赖项手动添加绑定重定向NuGet包。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的事情。虽然这是旧帖子,但这有助于我的Azure服务结构集群绑定问题:

  1. 切换到new project style
  2. 确保将.NET 4.6.1用于Web项目。使用<PackageOutputFolder> true </PackageOutputFolder>。 摘自this post
  3. 的底部