![](/img/trans.png)
[英]Higher .NET Framework Version for System.Net.Http than Project
[英]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.config
或web.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.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”屬性中指定的版本。
下表為您提供了有關版本差異的一些見解。
Microsoft自身有關綁定重定向的一些信息。
我有幾個項目被迫安裝.NETStandard 2.0,因為有些其他軟件包依賴於它,即使我們只是使用.NET 4.6.1。 經過很長時間的谷歌搜索(很抱歉,我不能指出您找到它的位置,因為它已經很久了),我能夠弄清楚,當您擁有使用程序集的netstandard2版本的軟件包時, VS會自動將System.Net.Http
強制為版本4.2.0,即使您沒有Dimi解釋的綁定重定向。 與netstandard2一起安裝的軟件包包括System.Buffers
, System.Collections.Immutable
, System.Memory
, System.Runtime.Compilers.Unsafe
和System.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(無論哪個可用)的程序集執行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.