在 .Net Framework 中使用最新版本的 System.Net.Http

13
System.Net.Http 的最新版本在 nuget 上是 4.3.4。但即使是最新的 .Net Framework 4.8 版本也只包含了 4.2.0 版本的该库。

即使我添加了 nuget 包 Visual Studio 2019 仍然从 .Net Framework 安装文件中获取 System.Net.Http.dll

有没有办法解决这个问题?

.Net Core 仍然不支持 WPF 和 WinForms 的设计器,所以我需要它能够与 .net framework 一起工作。

5个回答

9
完全同意你的看法,这确实令人困惑,但最终,在您的 app.config / web.config 文件中使用绑定重定向是解决问题的好方法。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

上面的代码段强制使用“newVersion”属性中指定的版本,无论代码中使用了哪个版本。
下表提供了有关版本差异的一些见解。
以下是微软本身有关绑定重定向的一些信息。请参考链接。
图片链接:Mapping NuGet - BindingRedirect

嗨,感谢您的回答。我将newVersion更改为4.2.1.0,这显然是nuget 4.3.4的dll版本。然后我手动将dll从packages文件夹复制到我的bin目录,但它显示“找到的程序集清单定义与程序集引用不匹配”。有什么想法可能发生了什么? - imlokesh
1
在您的情况下,bindingRedirect 应该如下所示:<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />。 - Dimi Takis

5
我有几个项目被迫安装了.NETStandard 2.0,因为某些其他包依赖它,尽管我们只使用.NET 4.6.1。经过长时间的谷歌搜索(我很抱歉不能告诉你我是在哪里找到的,因为那是很久以前做的),我得知当您使用 netstandard2 版本的程序集时,VS 将自动强制 System.Net.Http 版本为 4.2.0,即使您没有像Dimi所解释的那样进行绑定重定向。使用netstandard2安装的包括System.BuffersSystem.Collections.ImmutableSystem.MemorySystem.Runtime.Compilers.UnsafeSystem.Text.Encodings.Web (我确定还有更多)。
我最终不得不手动编辑 .csproj 文件,并强制这些程序集使用 netstandard1.x 版本。
<Reference Include="System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
  <HintPath>..\..\packages\System.Memory.4.5.1\lib\netstandard2.0\System.Memory.dll</HintPath>
</Reference>

例如,对于System.Memory的提示路径,指向netstandard2.0文件夹。如果您去packages文件夹,您会发现这个程序集有三种类型:netcoreapp211、netstandard1.1和netstandard2.0。我不需要第一个,因为我没有使用.NET Core,所以我将其更改为1.1。当所有指向netstandard2.0的程序集都更改为1.0或1.1(哪个可用就用哪个)后,Visual Studio允许我使用实际安装的System.Net.Http.4.3.4包。
我真的不知道为什么会有效,因为我对.NETStandard知之甚少,但它确实有效。

这是因为它查找位于 %USERPROFILE%.nuget\packages 目录下的 packagereferences 文件夹中的内容。 - Dimi Takis
@DimiTakis 我没有那个文件夹,可能是因为我仍在使用 packages.config,而不是 packagereference.json。 - howcheng

3

随着新版本的系统包发布,若你恰巧使用采用了新版本的库进行开发,.NET可能会变得非常麻烦。新版本包含一些库使用的额外API,如果你使用旧版本,你的程序可能仍然可以运行,但是在运行时会因为旧的DLL不包含特定定义方法而崩溃,报错MethodNotFoundException

即使你发布了最新版本,你仍然可能会遇到问题。例如,一个库使用System.Net.Http 4.2.0.0,另一个库使用System.Net.Http 4.3.0.0,而你将4.3.0.0与应用一同发布,使用4.2.0.0的库将寻找完全相同的4.2.0.0版本,并且由于你未包含相同的版本,它将使你的程序崩溃。 .NET团队预见到了这一点,并允许你的程序将4.2.0.0 重定向至4.3.0.0,这被称为绑定重定向。

当你有很多绑定重定向时,手动管理将变得不可能。

最好的方法是让计算机自动为你完成这个过程。更新.csproj文件,使其包含AutoGenerateBindingRedirects标签。

<Project>
  <PropertyGroup>
     <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  </PropertyGroup>
</Project>

接下来,更新你的app.configweb.config文件,并移除所有绑定重定向。
<configuration>
  <runtime>
     <!-- REMOVE THE ENTIRE SECTION START -->
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
      </dependentAssembly>
    </assemblyBinding>
    <!-- REMOVE ENTIRE SECTION END -->
  </runtime>
</configuration>

当您构建应用程序并检查 bin\Debug\YOURAPP.exe.config 时,您会发现自动添加了绑定重定向,以便所有库都查找单个DLL版本。

Web应用程序的附加步骤

如果您有一个 web.config,则过程是不同的。由于需要将 Web.config 发送到生产机器,因此需要添加正确的程序集绑定重定向。 Visual Studio 将计算所需的程序集绑定重定向并显示构建警告。

当您双击构建警告时,将在您的 web.config 中添加正确的程序集绑定重定向。

附加检查

如果您使用 packages.config,则应检查您的 .csproj 是否引用了在 packages.config 中定义的相同 nuget 版本。

但是,如果您正在构建 .exe 而不是 Web 应用程序,则建议将项目转换为使用 PackageReference。Visual Studio 将自动确保引用相同的版本,您无需进行检查。


1
不是这个问题的答案,但是相关且重要的是: 根据github上的官方帖子,你应该避免使用System.Net.Http的nuget包。如果他们有选择的话,他们永远不会再单独发布那个.dll文件了。

0
由于某种奇怪的原因,在我的情况下,System.Net.Http dll 的“复制本地”设置为 true。在两个项目中都是 true,而且所有引用中只有该 dll 是这样的。看起来很可疑,可能是 Visual Studio 或 NuGet 设置的。当我将其设置为 false 时,我的运行时问题消失了。我还从 app.config 中删除了 bindingRedirect,因为我无法让它正常工作。

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