主頁 > .NET開發 > .NET 6 Preview 2 發布

.NET 6 Preview 2 發布

2021-04-01 15:24:32 .NET開發

前言

在 2021 年 3 月 11 日, .NET 6 Preview 2 發布,這次的改進主要涉及到 MAUI、新的基礎庫和運行時、JIT 改進,

.NET 6 正式版將會在 2021 年 11 月發布,支持 Windows、macOS、Linux、Android 和 iOS 等系統以及 x86、x86_64、ARM 和 ARM64 架構,另外,.NET 6 是 LTS 版本,將提供長達至少三年的支持,

那么一起來看看都有哪些內容吧,

主題:改進內部回圈性能

過去的幾個 .NET 版本針對提升吞吐量、減少記憶體消耗等性能方面做了很多作業,而在 .NET 6 將會針對內部回圈性能做出改進:不僅僅追求在應用和服務上做到最佳的性能,還要追求在應用模型、工具鏈和作業流程上的最佳性能,

其中一些作業看起來與過去的傳統吞吐量優化作業非常相似,但實際上這里不關注穩態性能,而是關注運行時、應用模型、命令列、msbuild 等的啟動性能,以及工具的端到端性能(特別是對于較小的解決方案),

這種優化所涉及的思維方式通常與針對穩態吞吐量進行優化時所使用的思維方式大不相同,對于穩態作業,您可能會專注于快取將來可以重用的值,但是對于啟動性能而言,通常您將注意力集中在只能被呼叫一次的操作上,而第一次呼叫的成本很重要,

但是,這里涉及的作業確實與許多其他性能作業一樣,都有一個典型的測量-分析-修復回圈:分析要優化的應用程式的相關區域,分析結果資料以查找最主要的原因和瓶頸,然后為它們提出解決方案,然后重新開始尋找下一個有影響力的專案的程序,

我們仍然處于 .NET 6 開發周期的初期,但是我們已經成功地削減了開發人員內部回圈所涉及的關鍵領域的開銷,重點關注各種 dotnet 命令,例如 newbuildrun

目前已包含的改進例如:

  • 避免工具出現意料之外的 JIT:https://github.com/dotnet/installer/pull/9635
  • 避免未啟用日志時產生日志相關的昂貴開銷:https://github.com/dotnet/aspnetcore/pull/27956
  • 優化 MSBuild:https://github.com/dotnet/msbuild/pull/6151
  • 使用代碼生成器替換原 Razor 編譯器以加快編譯速度:https://github.com/dotnet/sdk/pull/15756
  • 優化訪問檔案的方式以減少觸發反病毒軟體的掃描:https://github.com/dotnet/runtime/pull/48774

當然,最佳性能優化之一是避免完成全部的作業,這是 .NET 6 主題另一半的重點:.NET 熱多載,通過允許在運行應用程式時甚至在未連接除錯器的情況下對代碼進行編輯,熱多載將在所有受支持的作業系統和硬體平臺上提高開發人員的生產率,開發人員修改代碼后不需要重新編譯和啟動程式,更改將立即生效,如此可以跳過整個更改-構建-運行周期,此特性有望從根本上改善 .NET 開發人員撰寫應用和服務的方式,

.NET 6 編譯速度改進

上圖展示了 .NET 5 和 .NET 6 Preview 2 的 razor 編譯時間對比,

主題:.NET 擁有優秀的客戶端開發體驗

.NET 6 最令人興奮的部分之一是移動開發,目前作為單獨的Xamarin 產品提供,隨著時間的流逝,我們一直在使 Xamarin 更類似于主線 .NET,現在是時候為 .NET 提供完全統一的移動產品了,使用 .NET 6,iOS,Android 和 macOS 開發將集成到 .NET SDK 中,并使用 .NET 庫,在過去的兩年中,我們一直在努力將 Mono 集成到 .NET 中,因此開發人員可以利用這兩種運行時的優勢,而不必針對不同的 .NET 版本,也不必擔心兼容性問題,在 .NET 5 中,我們將 Blazor WebAssembly 移了過來,并在 Xamarin 中使用了相同的模型,.NET 6 是這種統一努力的最高潮,涵蓋了主題的關鍵部分:Xamarin 開發人員可以升級到現有應用程式并使用最新的 .NET SDK,

現在,您所有的 .NET 應用程式都將在相同的庫上運行,我們希望增加在 PC 和移動平臺上共享的代碼量,Xamarin 的跨平臺 UI 框架 Xamarin.Forms 正在演變為 .NET MAUI,使您可以使用相同的代碼庫輕松撰寫適用于 iOS,Android,Windows 和 macOS 的應用程式,.NET MAUI 作為 .NET 6 的一部分提供,同時還進行了一系列性能和工具改進,例如 .NET/C# 熱多載、在跨不同平臺共享更多的資源和代碼,以及具有一組更靈活的 UI 控制元件的更好的頁面呈現性能,

.NET MAUI 不僅適用于客戶端應用程式開發人員,得益于重構的控制元件集以及可以在 .NET 6 庫上運行的功能,您現有的 Blazor 應用程式可以通過 .NET MAUI 在 Windows 和 macOS 上原生運行,您將能夠與 Blazor 代碼庫無縫結合原生控制元件和功能,包括特定于平臺的功能,

此主題的最后一部分是關于打包,部署和發布您的跨平臺客戶端應用程式,由于開發應用程式的開發人員/目標平臺/方式太多,因此每天結束時您必須分發許多不同的應用程式包,尤其是對于 Blazor 桌面,我們希望使體驗盡可能無縫,我們正在研究改善本地和云中發行和版本控制的策略,

總結一下,在 .NET 6,你將能夠:

  • 用 .NET 庫構建 iOS、Android 和 macOS 應用
  • 借助 .NET MAUI 使用相同的代碼創建 iOS、Android、Windows 和 macOS 客戶端應用
  • 在不同平臺之間共享代碼和資源
  • 在 macOS 和 Windows 上原生運行 Blazor 應用
  • 輕松打包和分發你的程式

MAUI 的 GitHub 倉庫:http://github.com/dotnet/maui

MAUI 更新

MAUI 的示例程式已經針對 .NET 6 Preview 2 更新:https://github.com/dotnet/net6-mobile-samples ,你可以直接使用 dotnet 的命令列構建和啟動應用,

Mac Catalyst

現在可以添加如下代碼到專案屬性中構建 macOS 的桌面應用:

<TargetFrameworks>net6.0-android;net6.0-ios</TargetFrameworks>
<TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">$(TargetFrameworks);net6.0-maccatalyst</TargetFrameworks>

單個多平臺應用專案

.NET MAUI 的單個專案體驗已經啟用,你可以通過一個專案檔案同時適配 Android、iOS 和 macOS;對于 Windows 的支持將會取決于 WinUI 3,因此這部分在未來會加入,

VS Solution

上圖展示了單個專案中包含多個平臺的開發體驗,

共享字體、圖片和應用圖示

字體和圖片也可以放到你的專案中的同一個位置,.NET MAUI 將允許你在所有平臺上訪問它們,例如:

<ItemGroup>
    <SharedImage Include="appicon.svg" ForegroundFile="appiconfg.svg" IsAppIcon="true" />
    <SharedFont Include="Resources\Fonts\ionicons.ttf" />
 </ItemGroup>

除了指定特定檔案之外,還支持使用 wild-card 按照路徑匹配所有的檔案作為共享圖片或者字體:

<ItemGroup>
    <SharedImage Include="appicon.svg" ForegroundFile="appiconfg.svg" IsAppIcon="true" />
    <SharedImage Include="Resources\Images*" />
    <SharedFont Include="Resources\Fonts*" />
</ItemGroup>

MAUI 應用使用 HostBuilder 啟動程式

利用類似 ASP.NET Core 配置的體驗配置 MAUI 程式,并支持依賴注入,例如:

public class Application : MauiApp
{
    public override IAppHostBuilder CreateBuilder() => 
        base.CreateBuilder()
            .RegisterCompatibilityRenderers()
            .ConfigureServices((ctx, services) =>
            {
                services.AddTransient<MainPage>();
                services.AddTransient<IWindow, MainWindow>();
            })
            .ConfigureFonts((hostingContext, fonts) =>
            {
                fonts.AddFont("ionicons.ttf", "IonIcons");
            });

    public override IWindow CreateWindow(IActivationState state)
    {
        Microsoft.Maui.Controls.Compatibility.Forms.Init(state);
        return Services.GetService<IWindow>();
    }
}

新的控制元件處理器

.NET MAUI 引入了全新的控制元件處理機制,Preview 2 中包含第一組利用這些機制的控制元件:ButtonLabelEntrySliderSwitch,如果想要加速實作其他控制元件,也歡迎社區 PR,具體可見:https://github.com/dotnet/maui/wiki/Handler-Property-PR-Guidelines ,

.NET MAUI 的示例程式現在從同一個專案運行在 macOS、iOS 和 Android 上,以下是運行效果:

macOS:

macOS

iOS:

iOS

Android:

Android

移動 SDK 更新

Android

  • 將默認庫設定為 Android X

iOS

  • Windows 上的開發者可以使用遠程 iOS 模擬器
  • Windows 上的開發者可以連接到遠程的 macOS 上構建應用
  • AOT 已經被添加和啟用以支持部署和分發 iOS 應用

.NET 庫更新

.NET 的庫在 Preview 2 中也有不少更新,

System.Text.Json 忽略回圈參考

System.Text.Json 現在支持忽略回圈參考了,對于回圈參考,可以不再拋出例外,而是像 Newtonsoft.Json 那樣簡單的設定成 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); // 輸出 {"Description":"Node 1","Next":null}
}

優先佇列 PriorityQueue

.NET 6 Preview 2 加入了新的優先佇列: System.Collections.Generic.PriorityQueue<TElement, TPriority>

// 創建一個 int 作為優先級的 string 佇列
var pq = new PriorityQueue<string, int>();

// 各種元素入隊
pq.Enqueue("A", 3);
pq.Enqueue("B", 1);
pq.Enqueue("C", 2);
pq.Enqueue("D", 3);

pq.Dequeue(); // 回傳 "B"
pq.Dequeue(); // 回傳 "C"
pq.Dequeue(); // 回傳 "A" 或者 "D"

改進的數值格式決議

對于標準數值格式,我們改進了其決議器,尤其是針對 .ToString.TryFormat 的改進,精度大于小數點后 99 位時的結果現在已被改進,并且還提供了對尾部 0 的更好支持:

  • 32.ToString("C100")
    • .NET 6:32.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    • .NET 5:存在 99 位精度的限制
  • 32.ToString("H99")32.ToString("H100")
    • .NET 6:拋出 FormatException
    • .NET 5:H 是一個無效的格式修飾,但是沒有拋出例外而是回傳了錯誤結果
  • double.Parse("9007199254740997.0")
    • .NET 6:9007199254740996
    • .NET 5:9007199254740998

SignalR 的可空型別標注

SingleR 現在已經完成了可空型別的標注,

運行時更新

.NET 6 Preview 2 在運行時上也有不少改進,

框架程式集使用 Crossgen2 預編譯

所有的 .NET 庫現在已經使用 crossgen 2 進行預編譯,目前只限于 .NET 的基礎庫,對于其他的庫比如 ASP.NET Core 和 Windows Desktop,則會在后續的預覽版本逐漸遷移到 crossgen 2,

Crossgen 2 本身并不是關注于性能改善的,而是用于啟用新的性能特性(如 PGO),不過 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

.NET 6 Preview 2 添加了以下改進:

  • Allow CSE & hoisting of vtable lookups for the indirections — dotnet/runtime #47808
  • Block counts in tiered compilation — dotnet/runtime #13672
  • Allow Inlinee profile scale-up — dotnet/runtime #48280
  • Efficient profiling scheme (e.g., spanning tree with efficient edge instrumentation) — dotnet/runtime #46882, dotnet/runtime #47509, dotnet/runtime #47476, dotnet/runtime #47072, dotnet/runtime #47597, dotnet/runtime #47723, dotnet/runtime #47876, dotnet/runtime #47959

JIT 改進

.NET 6 Preview 2 包含以下針對 JIT 的改進:

  • Not aligning cloned loops — dotnet/runtime #48090
  • MultiplyHigh intrinsics (smulh/umulh) — dotnet/runtime #47362

這些改進的結果分析可以在這里查看:

  • 2021 年 1 月 26 日:https://github.com/dotnet/runtime/issues/43227#issuecomment-767967603
  • 2021 年 2 月 3 日:https://github.com/dotnet/runtime/issues/43227#issuecomment-772914110

另外,對 ARM64 的優化也在不斷和 ARM 工程師一起進行中,

結語

以上就是 .NET 6 Preview 2 中的改進內容了,

.NET 6 的功能改進將會在 7 月之前全部完成,之后就會專注于質量上的改進了,

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/270426.html

標籤:.NET Core

上一篇:使用代碼生成工具快速開發ABP框架專案

下一篇:紙殼CMS 3.4 發布,電商功能增強

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • WebAPI簡介

    Web體系結構: 有三個核心:資源(resource),URL(統一資源識別符號)和表示 他們的關系是這樣的:一個資源由一個URL進行標識,HTTP客戶端使用URL定位資源,表示是從資源回傳資料,媒體型別是資源回傳的資料格式。 接下來我們說下HTTP. HTTP協議的系統是一種無狀態的方式,使用請求/ ......

    uj5u.com 2020-09-09 22:07:47 more
  • asp.net core 3.1 入口:Program.cs中的Main函式

    本文分析Program.cs 中Main()函式中代碼的運行順序分析asp.net core程式的啟動,重點不是剖析原始碼,而是理清程式開始時執行的順序。到呼叫了哪些實體,哪些法方。asp.net core 3.1 的程式入口在專案Program.cs檔案里,如下。ususing System; us ......

    uj5u.com 2020-09-09 22:07:49 more
  • asp.net網站作為websocket服務端的應用該如何寫

    最近被websocket的一個問題困擾了很久,有一個需求是在web網站中搭建websocket服務。客戶端通過網頁與服務器建立連接,然后服務器根據ip給客戶端網頁發送資訊。 其實,這個需求并不難,只是剛開始對websocket的內容不太了解。上網搜索了一下,有通過asp.net core 實作的、有 ......

    uj5u.com 2020-09-09 22:08:02 more
  • ASP.NET 開源匯入匯出庫Magicodes.IE Docker中使用

    Magicodes.IE在Docker中使用 更新歷史 2019.02.13 【Nuget】版本更新到2.0.2 【匯入】修復單列匯入的Bug,單元測驗“OneColumnImporter_Test”。問題見(https://github.com/dotnetcore/Magicodes.IE/is ......

    uj5u.com 2020-09-09 22:08:05 more
  • 在webform中使用ajax

    如果你用過Asp.net webform, 說明你也算是.NET 開發的老兵了。WEBform應該是2011 2013左右,當時還用visual studio 2005、 visual studio 2008。后來基本都用的是MVC。 如果是新開發的專案,估計沒人會用webform技術。但是有些舊版 ......

    uj5u.com 2020-09-09 22:08:50 more
  • iis添加asp.net網站,訪問提示:由于擴展配置問題而無法提供您請求的

    今天在iis服務器配置asp.net網站,遇到一個問題,記錄一下: 問題:由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射。 WindowServer2012服務器,添加角色安裝完.netframework和iis之后,運行aspx頁面 ......

    uj5u.com 2020-09-09 22:10:00 more
  • WebAPI-處理架構

    帶著問題去思考,大家好! 問題1:HTTP請求和回傳相應的HTTP回應資訊之間發生了什么? 1:首先是最底層,托管層,位于WebAPI和底層HTTP堆疊之間 2:其次是 訊息處理程式管道層,這里比如日志和快取。OWIN的參考是將訊息處理程式管道的一些功能下移到堆疊下端的OWIN中間件了。 3:控制器處理 ......

    uj5u.com 2020-09-09 22:11:13 more
  • 微信門戶開發框架-使用指導說明書

    微信門戶應用管理系統,采用基于 MVC + Bootstrap + Ajax + Enterprise Library的技術路線,界面層采用Boostrap + Metronic組合的前端框架,資料訪問層支持Oracle、SQLServer、MySQL、PostgreSQL等資料庫。框架以MVC5,... ......

    uj5u.com 2020-09-09 22:15:18 more
  • WebAPI-HTTP編程模型

    帶著問題去思考,大家好!它是什么?它包含什么?它能干什么? 訊息 HTTP編程模型的核心就是訊息抽象,表示為:HttPRequestMessage,HttpResponseMessage.用于客戶端和服務端之間交換請求和回應訊息。 HttpMethod類包含了一組靜態屬性: private stat ......

    uj5u.com 2020-09-09 22:15:23 more
  • 部署WebApi隨筆

    一、跨域 NuGet參考Microsoft.AspNet.WebApi.Cors WebApiConfig.cs中配置: // Web API 配置和服務 config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 二、清除默認回傳XML格式 ......

    uj5u.com 2020-09-09 22:15:48 more
最新发布
  • C#多執行緒學習(二) 如何操縱一個執行緒

    <a href="https://www.cnblogs.com/x-zhi/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2943582/20220801082530.png" alt="" /></...

    uj5u.com 2023-04-19 09:17:20 more
  • C#多執行緒學習(二) 如何操縱一個執行緒

    C#多執行緒學習(二) 如何操縱一個執行緒 執行緒學習第一篇:C#多執行緒學習(一) 多執行緒的相關概念 下面我們就動手來創建一個執行緒,使用Thread類創建執行緒時,只需提供執行緒入口即可。(執行緒入口使程式知道該讓這個執行緒干什么事) 在C#中,執行緒入口是通過ThreadStart代理(delegate)來提供的 ......

    uj5u.com 2023-04-19 09:16:49 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    <a href="https://www.cnblogs.com/huangxincheng/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/214741/20200614104537.png" alt="" /&g...

    uj5u.com 2023-04-18 08:39:04 more
  • 記一次 .NET某醫療器械清洗系統 卡死分析

    一:背景 1. 講故事 前段時間協助訓練營里的一位朋友分析了一個程式卡死的問題,回過頭來看這個案例比較經典,這篇稍微整理一下供后來者少踩坑吧。 二:WinDbg 分析 1. 為什么會卡死 因為是表單程式,理所當然就是看主執行緒此時正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ......

    uj5u.com 2023-04-18 08:33:10 more
  • SignalR, No Connection with that ID,IIS

    <a href="https://www.cnblogs.com/smartstar/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/u36196.jpg" alt="" /></a>...

    uj5u.com 2023-03-30 17:21:52 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:15:33 more
  • 一次對pool的誤用導致的.net頻繁gc的診斷分析

    <a href="https://www.cnblogs.com/dotnet-diagnostic/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/3115652/20230225090434.png" alt=""...

    uj5u.com 2023-03-28 10:13:31 more
  • C#遍歷指定檔案夾中所有檔案的3種方法

    <a href="https://www.cnblogs.com/xbhp/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/957602/20230310105611.png" alt="" /></a&...

    uj5u.com 2023-03-27 14:46:55 more
  • C#/VB.NET:如何將PDF轉為PDF/A

    <a href="https://www.cnblogs.com/Carina-baby/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/2859233/20220427162558.png" alt="" />...

    uj5u.com 2023-03-27 14:46:35 more
  • 武裝你的WEBAPI-OData聚合查詢

    <a href="https://www.cnblogs.com/podolski/" target="_blank"><img width="48" height="48" class="pfs" src="https://pic.cnblogs.com/face/616093/20140323000327.png" alt="" /><...

    uj5u.com 2023-03-27 14:46:16 more