上週微軟開發團隊釋出釋出。NET 6 Preview2。該版本引入了全新的API,執行時效能的改進以及。NET MAUI的早期構建以及對Apple Silicon的構建。
官方下載頁面已經提供適用於Windows,macOS和Linux的二進位制安裝包、容器映象、Linux發行包,可供下載嚐鮮。
官方表示。NET 6已透過在Visual Studio 16。9和Visual Studio for Mac 8。9測試透過,建議使用這些版本試用。
支援
。NET 6正式版本將於2021年11月釋出,並且有長達三年的長期支援(LTS)版本支援 。與。NET 5相比,各方面已得到顯著擴充套件,新增加對安卓、iOS、Mac和Mac Catalyst,用於x64和Apple Silicon(又稱“ M1”)以及Windows Arm64(特別是Windows桌面)的支援。
。NET 6 以大家對容器的支援,。NET 6 Debian容器映象(基於 Debian 11,“bullseye)也正在測試中。
改善。NET內部迴圈效能
對於所有。NET版本,效能都是最重要的。 在過去的幾個版本中,為提高吞吐量,減少記憶體消耗以及其他影響應用程式穩態效能的因素付出了很多努力。。NET 6,將重點放在兩個方面,其中一些方面是。NET 6主題之一的一部分: 提高。NET開發人員的內迴圈效能 ,希望確保開發人員能夠儘可能提高工作效率,最佳化經常在其內部迴圈中使用的工具和工作流程。 。
。NET 6另一個是。NET熱裝載。透過允許在執行應用程式時甚至在未連線偵錯程式的情況下對程式碼進行編輯,熱裝載將在所有受支援的作業系統和硬體平臺上提高開發人員的生產率。想要對應用程式或服務進行更改時,無需停止它並經歷典型的內部迴圈週期,即進行更改,構建,執行並回到觸發需求的應用程式或服務中對於最初的更改,可以跳過整個週期進行多種編輯。該功能涉及的工作跨越。NET版本,需要在執行時(coreclr和mono)上,C# Roslyn編譯器,應用程式模型(例如Blazor,。NET MAUI)和開發人員工具(例如CLI,Visual Studio),但有望從根本上改善。NET開發人員編寫其應用和服務的方式。
移動和多平臺應用APP開發
。NET 6最令人興奮的部分之一是移動開發,目前作為單獨的Xamarin產品提供。在。NET 6中,iOS,Android和macOS開發將整合到。NET SDK體驗中,並使用。NET庫。Mono也將打包到。NET中,開發人員可以利用兩個執行時優勢,而不必考慮不同的。NET版本,也不必擔心相容性問題。
。NET 6中所有的。NET應用程式都將在相同的庫上執行。Xamarin的跨平臺UI框架Xamarin。Forms演變成。NET MAUI多平臺應用程式UI,使使用者可以使用一套程式碼庫輕鬆適配iOS,Android,Windows和macOS APP。。NET MAUI作為。NET 6的一部分提供,同時還進行了一系列效能和工具改進,例如。NET/C# Hot Reload,跨不同平臺的更多共享資源和程式碼,以及具有一組更靈活的UI控制元件的更好的頁面呈現效能。
。NET MAUI不僅適用於客戶端應用程式開發人員。得益於重構的控制元件集以及可以在。NET 6庫上執行的功能,現有的Blazor應用程式可以透過。NET MAUI在Windows和macOS上本地執行。能夠與Blazor程式碼庫無縫地結合本機控制元件和功能,包括特定於平臺的功能。
對於打包,部署和釋出的跨平臺客戶端應用程式。由於開發應用程式的開發人員/目標平臺/方式太多,開發者需要分發許多不同的應用程式包。。NET推出了改善本地和雲中發行和版本控制的策略,桌面開發人員可以將其應用程式打包、分發、釋出和更新到多個桌面平臺和體系結構。在。NET 6中,將能夠:
使用。NET庫構建iOS,Android和macOS應用程式。
用。NET MAUI在相同的程式碼庫中建立iOS,Android,Windows和macOS應用程式。
跨平臺共享更多程式碼和資源(例如影象,應用程式圖示/清單等)。
在macOS和Windows上本地執行Blazor Web應用程式。
輕鬆打包和分發包含的所有目標框架的應用程式。
多平臺APP使用者介面
。NET 6添加了。NET MAUI和針對Android,iOS和Mac Catalyst的單個專案開發人員的經驗。
Mac Catalyst
可以使用Mac Catalyst 將以下TargetFramework設定新增到專案中,進行macOS桌面進行構建
多目標的應用程式專案
。NET MAUI應用程式已經有了單個專案體驗。使用者可以獲得可以在Android,iOS和macOS上執行的非常乾淨的解決方案。Windows支援取決於WinUI 3,它現在已在其預覽版中。目前需要從命令列進行構建和執行。Visual Studio的未來版本將新增裝置選擇和執行選項。
共享的字型,影象和應用程式圖示
字型和影象可以放置在解決方案中的一個位置,。NET MAUI可以使它們在目標平臺上本地執行。 在專案的*。csproj檔案中以 SharedImage 和 SharedFont定義:
兩者都接受萬用字元以包含一個位置中的所有檔案。
MauiApp與Host Builder共同引導應用程式
新增用於配置服務,字型和相容性渲染器以擴充套件Xamarin。Forms專案遷移的擴充套件。 IWindow已在將來的版本中引入了多視窗支援。新模式還為庫作者和控制元件供應商提供了一個統一的地方,可與。NET MAUI整合。
public class Application : MauiApp
{
public override IAppHostBuilder CreateBuilder() =>
base。CreateBuilder()
。RegisterCompatibilityRenderers()
。ConfigureServices((ctx, services) =>
{
services。AddTransient
services。AddTransient
})
。ConfigureFonts((hostingContext, fonts) =>
{
fonts。AddFont(“ionicons。ttf”, “IonIcons”);
});
public override IWindow CreateWindow(IActivationState state)
{
Microsoft。Maui。Controls。Compatibility。Forms。Init(state);
return Services。GetService
}
}
新的控制處理程式
實現新處理程式方法的第一個控制元件和屬性。這些包括Button,Label和Entry,Slider和Switch的部分實現。下面的 HelloMaui示例應用程式,支援從單一專案的MacOS,iOS版和Android執行:
移動SDK的更新
在新版本中,移動SDK和周圍的工具也正在不斷增加中。這些功能將與將來的Visual Studio發行版整合在一起,並將繼續得到改進。
安卓:
Android X庫現已可用於。NET 6,並且是Android應用程式的預設依賴項
iOS:
Windows上的開發人員可以使用遠端iOS模擬器
Windows上的開發人員可以連線到遠端Mac構建主機
提前編譯已新增,可用於構建和部署到物理iOS硬體
。NET庫
。NET庫中已添加了以下API和改進。
System。Text。Json–ReferenceHandler。IgnoreCycles
JsonSerializer(System。Text。Json) 現在支援序列化物件圖時忽略迴圈功能 。 這 ReferenceHandler。IgnoreCycles 選項具有與Newtonsoft。Json相似的行為 ReferenceLoopHandling。Ignore。 一個主要區別是System。Text。Json實現將引用迴圈替換為 null JSON令牌,而不是忽略物件引用。
以下示例中展示了ReferenceHandler。IgnoreCycles行為,在這種情況下, Next 屬性序列化為null,以避免形成一個死迴圈。
class Node
{
public string Description { get; set; }
public object Next { get; set; }
}
void Test()
{
var node = new Node { Description = “Node 1” };
node。Next = node;
var opts = new JsonSerializerOptions { ReferenceHandler = ReferenceHandler。IgnoreCycles };
string json = JsonSerializer。Serialize(node, opts);
Console。WriteLine(json); // Prints {“Description”:“Node 1”,“Next”:null}
}
PriorityQueue
PriorityQueue
下面的示例演示PriorityQueue
var pq = new PriorityQueue
pq。Enqueue(“A”, 3);
pq。Enqueue(“B”, 1);
pq。Enqueue(“C”, 2);
pq。Enqueue(“D”, 3);
pq。Dequeue(); // returns “B”
pq。Dequeue(); // returns “C”
pq。Dequeue(); // either “A” or “D”, stability is not guaranteed。
更好地解析標準數字格式
新改進了標準數字型別的解析器,特別是針對。ToString 和。TryFormat。當指定精度> 99個小數位時,它們將提供更好的結果。而且,解析器現在可以更好地支援 Parse方法。
32。ToString(“C100”) -> C132
。NET 6: $32。0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
。NET 5: We had an artificial limitation in the formatting code to only handle a precision of <= 99。
32。ToString(“H99”) -> throw a FormatException
。NET 6: throws a FormatException
32。ToString(“H100”) -> H132
。NET 6: throw a FormatException
。NET 5: H is an invalid format specifier。 So, we should’ve thrown a FormatException。 Instead, our incorrect behavior of interpreting precision >= 100 as custom formats meant we returned wrong values。
double。Parse(“9007199254740997。0”) -> 9007199254740998
。NET 6: 9007199254740996。
。NET 5: 9007199254740997。0 is not exactly representable in the IEEE 754 format。
SignalR 可空註釋
在 ASP。NET核心SignalR客戶端 軟體包已被 註釋為可空屬性 。當C#編譯器將提供適當的反饋啟用nullability時 基於SignalR API中對null的處理方式。
可空是。NET Core 3。x和。NET 5發行版的重點。所有。NET庫(也稱為“基類庫”)都作為這些發行版的一部分進行了註釋。
執行時
。NET執行時已進行了以下改進(或與之相關)。
框架程式集使用Crossgen2進行編譯
所有。NET庫都使用crossgen 2編譯跨所有受支援的作業系統和體系結構進行。 包括 Microsoft。NETCore。App目錄,例如ASP。NET或Windows Desktop。這些框架將在Preview 3和/或4中過渡到crossgen 2。
Crossgen 2的目的是啟用新的效能功能,例如 PGO。Crossgen 2基於一些針對性的大小最佳化提供了適度的磁碟上大小改進,如下面的比較所示。要點是轉移到Crossgen 2不會引起任何前期迴歸。
Size [MB] FullName
————- ————
64。22 C:Program FilesdotnetsharedMicrosoft。NETCore。App5。0。3
63。31 C:Program FilesdotnetsharedMicrosoft。NETCore。App6。0。0-preview。1。21102。12
63。00 C:Program FilesdotnetsharedMicrosoft。NETCore。App6。0。0-preview。2。21118。6
配置檔案引導的最佳化
概要檔案引導的最佳化使使用者能夠生成基於各種特徵而最佳的程式碼。目前正在構建靜態和動態PGO 變體。 在預覽2中進行了以下改進:
允許間接支援CSE和提升vtable查詢;
分層編譯中的塊計數;
允許內聯配置檔案按比例放大;
有效的配置方案(例如,具有有效邊緣檢測功能的生成樹);
JIT改進
為了最佳化JIT生成的程式碼,進行了以下改進。
不非對其clone迴圈;
MultiplyHigh intrinsics功能;
第二項改進特定於Arm64。將繼續 提高JIT為Arm64生成的程式碼的效能。