您好,登錄后才能下訂單哦!
這篇文章主要介紹“dotNET 5.0正式版本的新功能有哪些”,在日常操作中,相信很多人在dotNET 5.0正式版本的新功能有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”dotNET 5.0正式版本的新功能有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
今天微軟開發團隊宣布發布.NET 5.0正式版。主要更新包括C#9和F#5在內的一系列新功能和改進。同期發布了ASP.NET Core,EF Core,C#9和F#5。可以在官方下載頁面下載跨平臺包括Windows,macOS和Linux和跨處理架構包括x86,x64,Arm32,Arm64。
Windows Visual Studio用戶,需要Visual Studio 16.8或更高版本才能支持.NET 5.0,在macOS用戶,需要 Visual Studio for Mac的最新版本。VS Code的C#插件已經完全支持.NET 5.0和C#9。
一、.NET 5.0亮點
帶來了大量的功能改進,其中最亮眼的是:
.NET 5.0已通過在dot.net和Bing()上托管,進行了數月來的測試。性能和穩定性上有很大的提高。
C#9和F#5 帶了新的語言改進,例如C#9的Top-level編程和記錄,F#5提供了交互式編程,并提高了.NET上的功能性編程的性能。
.NET庫方面增強了Json序列化,正則表達式和HTTP(HTTP 1.1,HTTP/2)的性能。
由于改進了GC,分層編譯和其他方面,P95延遲有所減少。
通過ClickOnce客戶端應用程序發布,單文件應用程序,減小的容器映像大小以及添加的Server Core容器映像,應用程序部署選項更好。
Windows Arm64和WebAssembly擴展了平臺范圍。
1. 跨平臺和Microsoft支持
.NET 5.0有一個和.NET 3.1幾乎相同的平臺支持矩陣核心,適用于Windows,MacOS和Linux操作系統。如果操作系統支持使用.NET Core 3.1,則大多數情況下應該可以升級使用.NET 5.0。.NET 5.0最重要的新增功能是Windows Arm64。
.NET 5.0發布三個月后,會發布一個LTS版本.NET 6.0,.NET5.0技術支持會持續到2022年2月中。.NET6.0技術支持期為三年。
.NET 5.0是微軟第一個統一平臺愿景的實現版本,可以使用一組API,語言和工具來針對廣泛的應用程序類型,包括移動,云,桌面和IoT。
實現這一愿景的第一步是整合.NET倉庫,其中包括很大一部分的Mono。為.NET運行庫和庫提供一個存儲庫是在各處交付相同產品的前提。它還有助于進行廣泛的更改,這些更改會影響運行時和庫,這些存儲庫以前具有回購邊界。有些人擔心大型回購交易將更難管理。事實并非如此。
在.NET 5.0版本中,Blazor是利用回購合并和.NET統一的最佳示例。Blazor WebAssembly的運行時和庫現在是從合并的dotnet /運行時庫中構建的。服務器上的Blazor WebAssembly和Blazor使用完全相同的代碼。
2. 語言功能
作為.NET 5.0版本的一部分,C#9和F#5被包含在.NET 5.0 SDK中。Visual SDK也包含在5.0 SDK中。它不包括語言更改,但做了改進以支持.NET Core上的Visual Basic應用程序框架。
3. Top-level編程
Top-level編程是C#9中新推出的功能,下面一個led燈控制的演示程序,是官方Top-level編程的示例:
using System; using System.Device.Gpio; using System.Threading; var pin = 18; var lightTime = 1000; var dimTime = 200; Console.WriteLine($"Let's blink an LED!"); using GpioController controller = new (); controller.OpenPin(pin, PinMode.Output); Console.WriteLine($"GPIO pin enabled for use: {pin}"); // turn LED on and off while (true) { Console.WriteLine($"Light for {lightTime}ms"); controller.Write(pin, PinValue.High); Thread.Sleep(lightTime); Console.WriteLine($"Dim for {dimTime}ms"); controller.Write(pin, PinValue.Low); Thread.Sleep(dimTime); }
從示例中可以看到target-typed的使用以及new對controller變量的分配。GpioController類型在定義等式左側所定義。而類型是在右側推斷的。該新語法是得替代傳統的var方法。
通過定義方法并利用同一文件或其他文件中定義的類型,Top-level編程還可能更加復雜。
4. 邏輯和屬性模式
C#9包括對新模式的支持。下面的CCS811氣體傳感器程序是邏輯模式的示例:
var threshChoice = Console.ReadKey(); Console.WriteLine(); if (threshChoice.KeyChar is 'Y' or 'y') { TestThresholdAndInterrupt(ccs811); }
另一個新模式是屬性模式。可以在Mycroft Information Access 6.0示例中看到幾個屬性檢查。在下面的代碼是從所拍攝的PN532 RFID和NFC讀取器示例:
if (pollingType is not { Length: <=15 }) { return null; }
該代碼測試pollingType是否為null或包含>15個字節。用來作為返回之前要測試的兩個錯誤條件。測試條件可以寫:
byte[]?nullpollingType is null or { Length: > 15 }
另外兩種模式。第一個是邏輯圖形中Mcp25xxx CAN總線。
public static byte GetRxBufferNumber(Address address) => address switch { >= Address.RxB0D0 and <= Address.RxB0D7 => 0, >= Address.RxB1D0 and <= Address.RxB1D7 => 1, _ => throw new ArgumentException(nameof(address), $"Invalid address value {address}."), };
第二個是一個邏輯模式在壓電蜂鳴器控制器。
if (element is not NoteElement noteElement) { // In case it's a pause element we have only just wait desired time. Thread.Sleep(durationInMilliseconds); } else { var frequency = GetFrequency(noteElement.Note, noteElement.Octave); _buzzer.PlayTone(frequency, (int)(durationInMilliseconds * 0.7)); Thread.Sleep((int)(durationInMilliseconds * 0.3)); }
5. 記錄
C#9包括一種稱為記錄的新型類。與常規類相比,它具有許多優點,其中一半與更簡潔的語法有關。在下面的記錄是Bh2745 RGB傳感器的示例:
public record ChannelCompensationMultipliers(double Red, double Green, double Blue, double Clear);
可以這樣給其賦值:
ChannelCompensationMultipliers = new (2.2, 1.0, 1.8, 10.0);
6. 可空斷言改進
.NET庫現在已完全支持可空斷言。如果啟用可空性,將從平臺上獲取更多類型信息。
大類通常在從構造函數調用的幫助器方法中實例化對象成員。C#編譯器無法遵循對對象分配的調用流程。退出構造函數時,它會認為該成員為null,并使用發出警告CS8618。MemberNotNull屬性可解決此問題。該屬性應用于助手方法。然后,編譯器將看到設置了該值,并意識到該方法是從構造函數中調用的。
下面是一個在BMxx80溫度傳感器中的示例:
[MemberNotNull(nameof(_calibrationData))] private void ReadCalibrationData() { switch (this) { case Bme280 _: _calibrationData = new Bme280CalibrationData(); _controlRegister = (byte)Bmx280Register.CTRL_MEAS; break; case Bmp280 _: _calibrationData = new Bmp280CalibrationData(); _controlRegister = (byte)Bmx280Register.CTRL_MEAS; break; case Bme680 _: _calibrationData = new Bme680CalibrationData(); _controlRegister = (byte)Bme680Register.CTRL_MEAS; break; default: throw new Exception("Bmxx80 device not correctly configured. Could not find calibraton data."); } _calibrationData.ReadFromDevice(this); }
實際的代碼中使用了條件編譯。因為項目是多目標的,并且.NET 5.0+僅支持此屬性。使用該屬性可以跳過運行時檢查(在構造函數中)。
7. 應用部署
編寫或更新應用程序后,需要對其進行以使用戶受益。這可能是到Web服務器,云服務或客戶端計算機的,并且可能是使用Azure DevOps或GitHub Actions之類的服務的CI/CD流的結果。
.NET 5.0,專注于改進單個文件應用程序,減小docker多階段構建的容器大小,并為使用.NET Core部署ClickOnce應用程序提供更好的支持。
8. 容器
容器是最重要的云趨勢,.NET軟件堆棧的多個級別以多種方式對容器進行支持。首先是在基礎方面的支持,這越來越受到容器方案和部署容器化應用程序的開發人員的影響。
為和容器協調器的合作變得更加容易。添加了OpenTelemetry支持,以便可以從應用程序中捕獲分布式跟蹤和指標。dotnet-monitor是一個新工具,旨在作為從.NET進程訪問診斷信息的主要方法。特別是,已經開始構建dotnet-monitor的容器變體,可以將其用作應用程序sidecar。還在構建dotnet/tye,以提高微服務開發人員在開發和部署到Kubernetes環境中的生產率。
.NET運行時現在支持cgroup v2,預計它將在2020年以后成為與容器相關的重要API。Docker當前使用cgroup v1(.NET已經支持)。相比之下,cgroup v2比cgroup v1更簡單,更高效,更安全。Linux發行版和容器運行時正在。一旦變得更常見,.NET 5.0將在cgroup v2環境中正常工作。
除了Nano Server,還將發布Windows Server Core鏡像。該鏡像支持以下組合:Windows Server 2019長期服務通道(LTSC)、. NET 5.0和x64。還有其他更改,以減小Windows Server Core鏡像的大小。
作為使用" .NET"作為產品名稱的一部分,現在將.NET Core 2.1、3.1和.NET 5.0鏡像發布到repos系列。同.NET Core 2.1和3.1一起發布,同時支持多版本。.NET 5.0鏡像將發布到新位置。請相應地更新您的語句和腳本。
作為.NET 5.0的一部分,將SDK映像重新建立在ASP.NET鏡像之上,而不是buildpack-deps,以顯著減小在多階段構建方案中提取的聚合映像的大小。
Ubuntu 20.04 Focal 多階段構建成本:
下載節省量:100 MB(-30%)
Debian 10 Buster 多階段構建成本:
凈下載節省量:146 MB(-40%)
對Alpine和Nano Server進行了類似的更改。Alpine或Nano Server沒有任何buildpack-depssdk鏡像。對于多階段構建,將看到Alpine和Nano Server以及5.0的巨大成功。
9. 單文件應用
單個文件應用程序作為單個文件發布和部署。該應用程序及其依賴項都包含在該文件中。當應用程序運行時,依賴項直接從該文件加載到內存中(不影響性能)。
在.NET 5.0中,單個文件應用程序主要集中在Linux上(稍后再介紹)。它們可以是框架相關的,也可以是獨立的。依賴于全局安裝的.NET運行時,依賴于框架的單個文件應用程序可能很小。自包含的單文件應用程序較大(由于帶有運行時),但不需要作為安裝前步驟就安裝.NET運行時,因此可以正常工作。通常,依賴框架對開發和企業環境有利,而對于ISV,獨立包含通常是更好的選擇。
在所有平臺上,都有一個名為" apphost"的組件。這是成為可執行文件的文件,例如在Windows上或myapp.exe./myapp在基于Unix的平臺上。對于單文件應用程序,創建了一個新的應用程序主機"超級主機"。它具有與常規apphost相同的角色,但還包含運行時的靜態鏈接副本。超級主機是單文件方法的基本設計點。該模型是在帶有.NET 5.0的Linux上使用的模型。由于各種操作系統限制,無法在Windows或macOS上實現此方法。在Windows或macOS上沒有超級主機。在這些操作系統上,本機運行時二進制文件(約3個)位于單個文件應用程序旁邊(導致"不是單個文件")。
框架相關的單文件應用程序:
dotnet publish -r linux-x64 --self-contained false /p:PublishSingleFile=true
自包含的單文件應用程序:
dotnet publish -r linux-x64 --self-contained true /p:PublishSingleFile=true
還可以使用項目文件配置單個文件發布。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> <!-- The OS and CPU type you are targeting --> <RuntimeIdentifier>linux-x64</RuntimeIdentifier> <!-- Determine self-contained or framework-dependent --> <SelfContained>true</SelfContained> <!-- Enable single file --> <PublishSingleFile>true</PublishSingleFile> </PropertyGroup> </Project>
10. ClickOnce
ClickOnce一直是流行的.NET部署選項。.NET Core 3.1和.NET 5.0 Windows應用程序現在支持它。在.NET Core 3.0添加Windows Forms和WPF支持時,許多人會希望使用ClickOnce進行應用程序部署。在過去的一年中,.NET和Visual Studio團隊共同努力,以在命令行和Visual Studio中啟用ClickOnce發布:
目前支持的主要部署模型是框架相關的應用程序。對.NET桌面運行時(即包含WPF和Windows窗體的運行時)的依賴很容易。
Mage的最大變化是它現在是在NuGet上分發的.NET工具。這意味著不需要在計算機上安裝任何特殊的東西,只需要.NET 5.0 SDK就可以將Mage安裝為.NET工具。也可以使用它來發布.NET Framework應用程序,但是,SHA1簽名和部分信任支持已被刪除。Mage安裝命令如下:
dotnet tool install -g Microsoft.DotNet.Mage
制作并分發ClickOnce安裝程序后,用戶將看到熟悉的ClickOnce安裝對話框。
二、工具改善
新改進了Windows窗體設計器,更改了目標框架適用于.NET 5.0及更高版本的方式,更改了WinRT的支持方式,并進行了其他改進。
1. Windows窗體設計器
Windows Forms設計器(用于.NET Core 3.1和.NET 5.0)已經在Visual Studio 16.8中進行了更新,現在支持所有Windows Forms控件。它還支持WinForms控件的Telerik UI。設計器包括期望的所有設計器功能,包括:拖放,選擇,移動和調整大小,剪切/復制/粘貼/刪除控件,與屬性窗口集成,事件生成等。數據綁定和對更廣泛的第三方控件的支持即將推出。
2. .NET 5.0目標框架
新版本更改了用于目標框架的方法。以下項目文件演示了新的.NET 5.0目標框架。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> </PropertyGroup> </Project>
到目前為止,新表單比目前使用的樣式更緊湊,更直觀。另外,正在擴展目標框架以描述操作系統依賴性。
Windows桌面API(包括Windows窗體,WPF和WinRT)僅在net5.0-windows可用。可以指定操作系統版本,例如net5.0-windows7或net5.0-windows10.0.17763.0。如果要使用WinRT API,則需要為Windows 10版本。
使用新的net5.0-windows TFM時,跨平臺方案可能會更具挑戰性。如果您要避免為Windows構建或避免在Linux上提取Windows運行時程序包,
3. WinRT Interop(重大更改)
Windows API主題上,已移至一個新模型,以作為.NET 5.0的一部分來支持WinRT API。包括調用API(在任一方向上;CLR <==> WinRT),兩個類型系統之間的數據封送處理以及打算在類型系統或ABI邊界上統一對待。
在.NET 5.0中現有的WinRT互操作體系已被去除,這是一個巨大的變化。這意味著使用WinRT和.NET Core 3.x的應用程序和庫將需要重建,并且不能按原樣在.NET 5.0上運行。使用WinRT API的庫將需要多目標來管理.NET Core 3.1和.NET 5.0之間的這種差異。
未來,將依靠Windows中的WinRT團隊提供的新CsWinRT工具。它生成基于C#的WinRT互操作程序集,可以通過NuGet交付該程序集。Windows團隊正是針對Windows中的WinRT API所做的。希望將WinRT(在Windows上)用作互操作系統的任何人都可以使用該工具,以將本機API公開給.NET或將.NET API公開給本機代碼。
CsWinRT工具在邏輯上類似于TLBIMP和tlbexp,雖然好多了。tlb工具依賴于.NET運行時中的許多COM互操作管道。CsWinRT工具僅依賴于公共.NET API。就是說,C#9中的函數指針功能(部分在.NET 5.0運行時中實現)在某種程度上受到CsWinRT工具需求的啟發。
這種新的WinRT互操作模型有幾個好處:
可以獨立于.NET運行時進行開發和改進。
它與為其他操作系統(如iOS和Android)提供的基于工具的互操作系統對稱。
該工具可以利用其他.NET功能(AOT,C#功能,IL鏈接),而以前的系統則不提供該功能。
簡化.NET運行時代碼庫。
無需添加NuGet引用即可使用WinRT API。對于indows 10 TFM(在前面的.NET 5.0 TFM部分中已經討論過)就足夠了。如果目標是.NET Core 3.1或更早版本,則需要引用WinRT軟件包。
4. 本機導出
已經為導出本機二進制文件啟用導出,而本機二進制文件在很長一段時間內都已調用.NET代碼。該方案的構建塊是對UnmanagedCallersOnlyAttribute的。
.NET Native導出項目支持:
公開自定義的本地出口。
不需要像COM這樣的高級互操作技術。
跨平臺工作。
5. 事件管道
事件管道是在.NET Core 2.2中添加的新的系統和API,可以在任何操作系統上執行性能和其他診斷調查。在.NET 5.0中,事件管道已得到擴展,以使事件探查器能夠寫入事件管道事件。對于以前依靠ETW(在Windows上)監視應用程序行為和性能的分析探查器,此方案至關重要。
新版本中可以通過事件管道獲得程序集加載信息。這項改進是開始提供類似的診斷功能(作為.NET Framework的一部分)的開始,例如。現在,可以使用通過以下命令來收集此信息:
dotnet-trace collect --providers Microsoft-Windows-DotNETRuntime:4:4 -- ./MyApp –my-arg 1
工作流在dotnet-trace docs中進行了描述。可以查看簡單測試應用程序的程序集加載信息。
6. Microsoft.Extensions.Logging
Microsoft.Extensions.Logging庫中的控制臺日志提供程序進行了改進。可以通過ConsoleFormatter自定義對控制臺輸出的格式和顏色進行完全控制。格式化程序API通過實現VT-100(大多數現代終端支持的)轉義序列的子集來實現豐富的格式化。控制臺記錄器可以解析不受支持的終端上的轉義序列,使您可以為所有終端編寫單個格式化程序。
除了支持自定義格式器外,還添加了內置的JSON格式器,該格式器向控制臺發出結構化JSON日志。
7. Dump調試
調試托管代碼需要了解托管對象和構造。數據訪問組件(DAC)是運行時執行引擎的子集,該引擎具有這些構造的知識,并且可以在沒有運行時的情況下訪問這些托管對象。現在,可以使用WinDBG或dotnet dump analyze在Windows上分析在Linux上收集的.NET Core進程dump。
還添加了對從macOS上運行的.NET進程捕獲ELF dump的支持。由于ELF不是macOS上的本機可執行文件(像lldb這樣的本地調試器將無法與這些dump一起使用)文件格式,因此將其設為選擇加入功能。要在macOS上支持收集,請設置環境變量COMPlus_DbgEnableElfDumpOnMacOS=1。可以使用dotnet dump analyze來分析產生的dump。
8. 打印環境信息
隨著.NET擴展了對新操作系統和芯片體系結構的支持,有時需要一種打印環境信息的方法。.NET5創建了一個簡單的.NET工具dotnet-runtimeinfo來執行該操作。
可以使用以下命令安裝和運行該工具。
dotnet tool install -f dotnet-runtimeinfo dotnet-runtimeinfo
該工具以可以生成諸如如下格式的環境信息。
**.NET information Version: 5.0.0 FrameworkDescription: .NET 5.0.0 Libraries version: 5.0.0 Libraries hash: cf258a14b70ad9069470a108f13765e0e5988f51 **Environment information OSDescription: Linux 5.8.6-1-MANJARO-ARM #1 SMP Thu Sep 3 22:01:08 CEST 2020 OSVersion: Unix 5.8.6.1 OSArchitecture: Arm64 ProcessorCount: 6 **CGroup info** cfs_quota_us: -1 memory.limit_in_bytes: 9223372036854771712 memory.usage_in_bytes: 2740666368
其他更新
1. Windows Arm64
.NET應用程序現在可以在Windows Arm64上本機運行。這是在.NET Core 3.0中添加的對Linux Arm64的支持(對glibc和musl的支持)。
在.NET 5.0中,可以在Windows Arm64設備(例如Surface Pro X)上開發和運行應用程序。已經可以通過x86仿真在Windows Arm64上運行.NET Core和.NET Framework應用程序。這是可行的,但是本機Arm64執行具有更好的性能。
用于Arm64的MSI安裝程序是此版本的最終更改之一。下面是.NET 5.0 SDK安裝程序。
Windows Arm64上支持SDK,控制臺和ASP.NET Core應用程序,但Windows桌面組件暫不支持。
2. Windows上支持ICU
ICU庫用于Unicode和全球化支持,以前僅在Linux和macOS上使用。現在在Windows 10上使用相同的庫。此更改使全球化API的行為(如特定文化區域的字符串比較)在Windows 10,macOS和Linux之間保持一致。還將ICU與Blazor WebAssembly支持一起使用。
3. System.Text.Json
在.NET 5.0中已進行了顯著改善,在性能,可靠性,并使熟悉Newtonsoft.Json的人們更容易采用。它還包括對將JSON對象反序列化為記錄的支持。
使更新可用時,用戶將看到更新對話框。
到此,關于“dotNET 5.0正式版本的新功能有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。