绑定重定向地狱

Kat*_*tie 9 c# wpf assembly-binding-redirect .net-standard

我有一个.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>
Run Code Online (Sandbox Code Playgroud)

至少,它把问题转移到了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>
Run Code Online (Sandbox Code Playgroud)

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

无法加载文件或程序集'System.IO.Compression,Version = 4.2.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其依赖项之一.该系统找不到指定的文件

具有以下内部异常:

无法加载文件或程序集'System.IO.Compression,Version = 4.1.1.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'或其依赖项之一.该系统找不到指定的文件

如果我尝试添加绑定重定向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重定向......但无论我做什么,内部异常持续存在.是的,在你问之前,我知道这个程序集的publicKeyToken与其他程序集不同.

另外注意,我发现一些StackOverflow帖子提到添加<RestoreProjectStyle>PackageReference</RestoreProjectStyle>和/或<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>我的.csproj将解决这些问题.我试过这个,但它绝对没有任何意义.此外,我的所有项目都使用PackageReference不是 packages.config

所以,我有两个问题:

  1. 我该怎么处理这个System.IO.Compression 4.2.0.0/ 4.1.1.0依赖问题?
  2. 对这些问题有更好的长期解决方案吗?我觉得非常难以理解,无论.Net Standard何时我将NuGet包添加到我的一个库中,我都会遇到一堆运行时错误,除非我去为System.XNuGet包的每个依赖项手动添加绑定重定向.

Ger*_*alt 1

我遇到了类似的事情。虽然这是旧帖子,但以下内容有助于解决我的 Azure Service Fabric 集群绑定问题:

  1. 切换到新的项目风格
  2. 请务必对 Web 项目使用 .NET 4.6.1。使用<PackageOutputFolder> true </PackageOutputFolder>。取自这篇文章的底部。