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

qqrboqgw  于 12个月前  发布在  .NET
关注(0)|答案(5)|浏览(149)

nuget上System.Net.Http的最新版本是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一起工作。

whitzsjs

whitzsjs1#

完全同意你的观点,这是令人困惑的,但在最后,绑定重定向是你的朋友在这里使用你的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”属性中指定的代码版本。
下表为您提供了有关版本控制差异的一些见解。
x1c 0d1x的数据
关于binding redirection的一些信息由微软自己提供。

dsekswqp

dsekswqp2#

我有几个项目,我被迫安装.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文件夹,您会发现此程序集有三种风格:netcoreapp211netstandard1.1netstandard2.0。我不想要第一个,因为我没有使用.NET Core,在对所有指向netstandard2.0的程序集执行了这个操作后,VS允许我使用我实际安装的System.Net.Http.4.3.4包。
我真的不知道为什么这样做,因为我对.NETStandard几乎一无所知,但它确实如此。

8yoxcaq7

8yoxcaq73#

.NET的开发可能会非常痛苦,因为新版本的系统包发布了,而你碰巧使用了一个采用新版本的库。新版本包含库使用的一些额外的API,如果你使用旧版本,你的程序可能仍然运行,但在运行时与MethodNotFoundException崩溃,因为旧的DLL不包含定义的特定方法。
即使你发布的是最新版本,你仍然可能会遇到问题。例如,一个库使用System. Net. Http 4.3.0.0,另一个库使用System.Net.Http 4.2.0.0,而你发布的应用程序是4.3.0.0,使用www.example.com的库将查找 * 确切 * 版本4.2.0.0,并使你的程序崩溃,因为你没有包含相同的版本。.NET团队预料到了这一点,并允许你的程序 * 重定向 * 4.2.0.0到4.3.0.0,这被称为绑定重定向。4.2.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.xml中。

附加检查

如果你使用packages.config,那么你应该检查你的.csproj是否引用了packages.config中定义的相同版本的nuget。
但是,如果您正在构建.exe,而不是Web应用程序,我建议您将项目转换为使用PackageReference。Visual Studio将确保自动引用相同的版本,您不必检查。

kulphzqa

kulphzqa4#

出于某种奇怪的原因,我的案例中的System.Net.Http dll将“Copy local”设置为true。在两个项目中,它是true,并且所有引用中只有该dll。Visual Studio或NuGet将其设置为这种方式看起来很可疑。当我将其设置为false时,我的运行时问题就消失了。我从app.config中删除了bindingRedirect,我无法使用它。

izkcnapc

izkcnapc5#

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

相关问题