簡體   English   中英

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

[英]Use latest version of System.Net.Http in .Net Framework

nuget上System.Net.Http的最新版本是4.3.4。 但即使是最新的 .Net Framework 4.8 也附帶了這個庫的 4.2.0。

即使我添加了 nuget package,Visual Studio 2019 仍然會從 .Net Framework 安裝文件中獲取System.Net.Http.dll

有什么辦法可以解決這個問題嗎?

.Net Core 仍然沒有對 wpf 和 winforms 的設計器支持,這就是為什么我需要它來使用 .net 框架。

.NET 隨着新版本系統包的發布,開發起來會非常痛苦,而你恰好使用了采用新版本的庫。 新版本包含庫使用的一些額外 API,如果您使用舊版本,您的程序可能仍會運行,但在運行時會因MethodNotFoundException而崩潰,因為舊版本 DLL 不包含定義的特定方法。

即使您發布了最新版本,您仍然會遇到問題。 例如,一個庫使用 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 。

但是,如果您正在構建 an.exe,而不是 web 應用程序,我建議您將項目轉換為使用 PackageReference。 Visual Studio 將確保自動引用相同的版本,您無需檢查。

完全同意您的說法,這很令人困惑,但是最后綁定重定向是您的朋友與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”屬性中指定的版本。

下表為您提供了有關版本差異的一些見解。

映射NuGet-BindingRedirect

Microsoft自身有關綁定重定向的一些信息。

我有幾個項目被迫安裝.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,因此我將其更改為使用1.1。 在對所有指向netstandard2.0到1.0或1.1(無論哪個可用)的程序集執行netstandard2.0之后,VS然后允許我使用我實際安裝的System.Net.Http.4.3.4程序包。

我真的不知道為什么這行得通,因為我對.NETStandard幾乎一無所知,但是確實如此。

出於某種奇怪的原因,在我的例子中 System.Net.Http dll 將“Copy local”設置為true 在兩個項目中都是如此,並且只有所有引用的那個 dll。 Visual Studio 或 NuGet 以這種方式設置它看起來很可疑。 當我將它設置為 false 時,我的運行時問題就消失了。 我從 app.config 中刪除了 bindingRedirect,我無法使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM