詳解.NET Core 3.0中的新變化
.NET Core 3.0 是 .NET Core 平臺(tái)的下一主要版本。本文回顧了 .Net Core 發(fā)展歷史,并展示了它是如何從基本支持 Web 和數(shù)據(jù)工作負(fù)載的版本 1,發(fā)展成為能夠運(yùn)行 Web、桌面、機(jī)器學(xué)習(xí)、容器、IoT 等的版本 3.0。
.NET Core 1
.NET Core 的歷史可追溯到幾年前,版本 1 是在 2016 年推出,旨在生成第一版開放源代碼和跨平臺(tái)(Windows、macOS 和 Linux)的 .NET。靈感來(lái)源于只能使用開放源代碼框架的客戶,以及需要在 Linux 服務(wù)器上運(yùn)行 .NET 應(yīng)用程序的其他客戶。由于 .NET Core 是跨平臺(tái)的,因此根據(jù)設(shè)計(jì),可使用命令行完成所有操作,而無(wú)需使用 IDE。為了應(yīng)對(duì)全局安裝的 .NET Framework 的兼容性挑戰(zhàn),它設(shè)計(jì)有并行支持,包括隨附作為應(yīng)用程序一部分的框架,這樣應(yīng)用程序就不會(huì)依賴在計(jì)算機(jī)上安裝的任何框架。版本 1 隨附新版 ASP.NET、實(shí)體框架 (EF) 和主要定目標(biāo)到的 Web 應(yīng)用程序。
.NET Core 2
雖然版本 1 支持在新平臺(tái)上運(yùn)行 .NET,但它僅支持一組數(shù)量有限的 .NET API。為了解決此問(wèn)題,我們創(chuàng)建了 .NET Standard,它指定了任何 .NET 運(yùn)行時(shí)必須實(shí)現(xiàn)的 API,這樣就能跨 .NET 平臺(tái)和版本共享代碼和二進(jìn)制文件了。在 .NET Standard 2.0 中,我們向 .NET Standard 規(guī)范添加了超過(guò) 20,000 個(gè) API。.NET Core 版本 2 于 2017 年 6 月發(fā)布,并支持 .NET Standard 2.0,使其有權(quán)訪問(wèn)這些 API。我們還引入了 Windows 兼容性包,這是包含許多僅 Windows API(如 System.Drawing、System.DirectoryServices 等)的 NuGet 包。ASP.NET Core 2.0 引入了 .NET Core 1.0 中缺少的兩個(gè)框架,即 Razor Pages 和 SignalR。Entity Framework Core 開始支持延遲加載,這是一項(xiàng)熱門實(shí)體框架功能。.NET Core 2 還在不斷推動(dòng) .NET 成為最快的完整堆??蚣苤弧echEmpower 基準(zhǔn)由一家獨(dú)立公司運(yùn)行,將 .NET Core 列為原始純文本性能領(lǐng)域的第 7 名,并將它列為 Web 和數(shù)據(jù)性能 Fortunes 測(cè)試中的第 6 名,擊敗了 Java servlet 和 Node.js (bit.ly/2PEE1l1)。
.NET Core 3.0
.NET Core 3.0 是 .NET Core 平臺(tái)的下一主要版本。它新增了許多令人興奮的功能,如支持使用 Windows 窗體 (WinForms)、Windows Presentation Foundation (WPF) 和實(shí)體框架 6 的 Windows 桌面應(yīng)用程序。對(duì)于 Web 開發(fā),它開始支持使用 C# 通過(guò) Razor 組件(舊稱為 Blazor)生成客戶端 Web 應(yīng)用程序。此外,它還支持 C# 8.0 和 .NET Standard 2.1。
我們正在 .NET Core 3.0. 中添加對(duì)物聯(lián)網(wǎng) (IoT) 方案的支持?,F(xiàn)在可以在 Raspberry Pi 和類似設(shè)備上對(duì)硬件插針(用于控制設(shè)備和讀取傳感器數(shù)據(jù))進(jìn)行編程,并在所有受支持的 OS 上(例如,使用 Raspberry Pi 或 Arduino)通過(guò)串行端口進(jìn)行通信。我們還在此版本中添加了適用于 ARM64 的 IoT 設(shè)備支持,以補(bǔ)充現(xiàn)有 ARM32 功能。
.NET Core 3.0 還將完全支持 ML.NET,這是為 .NET 開發(fā)人員生成的開放源代碼機(jī)器學(xué)習(xí)框架。ML.NET 強(qiáng)力驅(qū)動(dòng) Azure 機(jī)器學(xué)習(xí)、Windows Defender 和 PowerPoint Design Ideas 等產(chǎn)品。使用 ML.NET,可以將許多常用機(jī)器學(xué)習(xí)方案添加到應(yīng)用中,如情緒分析、建議、預(yù)測(cè)、圖像分類等。若要了解詳細(xì)信息,請(qǐng)?jiān)L問(wèn)bit.ly/2OLRGRQ。
我們最近發(fā)布了 .NET Core 3.0 的首個(gè)預(yù)覽版。若要詳細(xì)了解 .NET Core 3.0 和試用預(yù)覽版,請(qǐng)?jiān)L問(wèn)aka.ms/netcore3preview1。
桌面(WinForms 和 WPF)和開放源代碼
WinForms 和 WPF 是兩個(gè)最常用的 .NET 應(yīng)用程序類型,有數(shù)百萬(wàn)開發(fā)人員在使用。.NET Core 3.0 開始支持 WinForms 和 WPF,將 Windows 桌面開發(fā)引入了 .NET Core。.NET Core 一直以來(lái)都是開放源代碼的,在 GitHub 中這兩個(gè)框架與剩余的 .NET Core 一樣,也都是開放源代碼的。客戶將有史以來(lái)第一次能夠見證這些框架的開放開發(fā),甚至可以通過(guò)提問(wèn)、修復(fù) bug 或幫助在 GitHub 中實(shí)時(shí)開發(fā)新功能,從而提供幫助。WinUI XAML 庫(kù)也將是開放源代碼的。通過(guò) XAML Islands,可以在 WinForms 和 WPF 應(yīng)用程序中使用這些控件。
許多現(xiàn)有 WinForms 和 WPF 應(yīng)用程序都使用實(shí)體框架來(lái)訪問(wèn)數(shù)據(jù),因此 .NET Core 也支持實(shí)體框架 6。
你可能想要知道,為什么要在 .NET Core 上生成桌面應(yīng)用程序。很簡(jiǎn)單:這樣才能受益于 .NET Core 中的所有增強(qiáng)功能。不僅可以在最新版框架上生成應(yīng)用程序,而無(wú)需安裝 .NET Core,還能將應(yīng)用程序和 .NET Core 發(fā)布到一個(gè) .EXE 中。.NET Core 在設(shè)計(jì)時(shí)考慮到了并行支持,因此可以在一臺(tái)計(jì)算機(jī)上安裝多個(gè)版本,并能將應(yīng)用程序鎖定到設(shè)計(jì)時(shí)定目標(biāo)到的版本。此外,鑒于這種并行本質(zhì),可以改進(jìn) .NET Core 中的 API(包括 WinForms 和 WPF),而無(wú)需承擔(dān)損壞應(yīng)用程序的風(fēng)險(xiǎn)。
ASP.NET Core 3
不過(guò),.NET Core 3.0 并不都是與桌面相關(guān)。還有許多令人興奮的新功能是針對(duì) Web 設(shè)計(jì)的。接下來(lái)將介紹我們正在開發(fā)的幾項(xiàng)功能。
客戶經(jīng)常問(wèn)的一個(gè)問(wèn)題是,如何在 .NET Core 中獲得 RPC 體驗(yàn)(就像在 .NET 遠(yuǎn)程和 Windows Communication Foundation 中一樣)。我們正在參與 gRPC (grpc.io) 項(xiàng)目,以確保 gRPC 能夠?yàn)?.NET 開發(fā)人員提供一流支持。
在今年早些時(shí)候,我們開始了一項(xiàng)試驗(yàn),即使用 .NET(我們稱之為 Blazor)進(jìn)行客戶端 Web 開發(fā)。借助 Blazor,可以編寫直接在瀏覽器中的基于 WebAssembly 的 .NET 運(yùn)行時(shí)內(nèi)運(yùn)行的 Web UI 組件,而無(wú)需編寫一行 JavaScript。使用 Razor 語(yǔ)法創(chuàng)作組件,這些組件與代碼一起被編譯到常規(guī) .NET 程序集中。然后,程序集和基于 WebAssembly 的 .NET 運(yùn)行時(shí)被下載到瀏覽器中,僅使用開放式 Web 標(biāo)準(zhǔn)就能執(zhí)行它們(無(wú)需任何插件或代碼轉(zhuǎn)換),如圖 1所示。
圖 1:使用 Blazor 進(jìn)行客戶端 Web 開發(fā)
也可以使用 .NET Core 在服務(wù)器上運(yùn)行相同組件,其中所有 UI 交互和 DOM 更新都是通過(guò) SignalR 連接進(jìn)行處理,如圖 2所示。執(zhí)行后,組件跟蹤 DOM 所需的更新,并通過(guò) SignalR 連接將要應(yīng)用的這些更新發(fā)送到瀏覽器。UI 事件使用同一連接發(fā)送到服務(wù)器。此模型的優(yōu)點(diǎn)有多個(gè):下載大小更小、代碼集中在服務(wù)器上,以及受益于在 .NET Core 上運(yùn)行組件的所有功能和性能優(yōu)勢(shì)。
圖 2:使用 SignalR 在服務(wù)器上運(yùn)行 UI Web 組件
對(duì)于 .NET Core 3.0,我們將把 Blazor 組件模型集成到 ASP.NET Core 中。我們將此集成組件模型稱為“Razor 組件”。Razor 組件開啟了以下新時(shí)代:使用 ASP.NET Core 的可組合 UI,以及使用 .NET 的完整堆棧 Web 開發(fā)。對(duì)于 .NET Core 3.0,Razor 組件最初作為獨(dú)立可路由組件,或通過(guò) Razor Pages 和視圖使用的組件在服務(wù)器上運(yùn)行。不過(guò),相同組件也可以在 WebAssembly 上進(jìn)行客戶端運(yùn)行。在開發(fā) .NET Core 3.0 的同時(shí),我們還將繼續(xù)著手以下工作:支持使用基于解釋器的 .NET 運(yùn)行時(shí)在 WebAssembly 上運(yùn)行 Razor 組件,預(yù)計(jì)將在后續(xù)版本中提供。之后,我們還計(jì)劃向 WebAssembly 發(fā)布對(duì) .NET 代碼的完全預(yù)編譯支持,這將顯著提升運(yùn)行時(shí)性能。
EF Core 3.0
LINQ 是一項(xiàng)用戶鐘愛(ài)的 .NET 功能,可便于編寫數(shù)據(jù)庫(kù)查詢,而無(wú)需離開所選的語(yǔ)言,同時(shí)還能利用豐富的類型信息來(lái)獲取 IntelliSense 和編譯時(shí)類型檢查。不過(guò),LINQ 也支持編寫數(shù)量幾乎不限的復(fù)雜查詢,而這對(duì)于 LINQ 提供程序來(lái)說(shuō),一直都是一項(xiàng)巨大挑戰(zhàn)。EF Core 部分解決了此問(wèn)題,具體方法是支持選擇可轉(zhuǎn)換為 SQL 的查詢部分,再執(zhí)行內(nèi)存中剩余的查詢。在某些情況下,這樣做是可取的,但在其他許多情況下,這可能會(huì)導(dǎo)致非常低效的查詢直到應(yīng)用程序投入生產(chǎn)才被發(fā)現(xiàn)。
在 EF Core 3.0 中,我們計(jì)劃深入更改 LINQ 實(shí)現(xiàn)工作原理和測(cè)試方式,旨在提高它的可靠性(例如,避免破壞修補(bǔ)程序版本中的查詢);讓它能夠?qū)⒏啾磉_(dá)式正確轉(zhuǎn)換為 SQL;在更多情況下生成高效查詢;以及防止直到投入生產(chǎn)才被檢測(cè)到的非常低效查詢出現(xiàn)。
我們一直在致力于開發(fā)適用于 EF Core 的 Cosmos DB 提供程序,以便開發(fā)人員能夠熟悉 EF 編程模型,從而輕松地將 Azure Cosmos DB 定目標(biāo)為應(yīng)用程序數(shù)據(jù)庫(kù)。目標(biāo)是利用 Cosmos DB 的一些優(yōu)勢(shì),如全局分發(fā)、“始終開啟”可用性、彈性可伸縮性和低延遲,甚至包括 .NET 開發(fā)人員可以更輕松地訪問(wèn)它。此提供程序?qū)⑨槍?duì) Cosmos DB 中的 SQL API 啟用大部分 EF Core 功能,如自動(dòng)更改跟蹤、LINQ 和值轉(zhuǎn)換。
我們計(jì)劃在 EF Core 3.0 中添加的其他功能包括,屬性包實(shí)體(將數(shù)據(jù)存儲(chǔ)在索引屬性(而不是常規(guī)屬性)中的實(shí)體);能夠?qū)?shù)據(jù)庫(kù)視圖反向工程為查詢類型;以及與新 C# 8.0 功能集成,如 IAsyncEnumerable<T> 支持和可以為 null 的引用類型。
我們理解,對(duì)于許多使用舊版 EF 的現(xiàn)有應(yīng)用程序來(lái)說(shuō),移植到 EF Core 的工作量巨大。正因?yàn)榇耍覀冞€移植了 EF 6,以便能夠使用 .NET Core。
.NET Standard 2.1
如果遵循 .NET Standard,可以創(chuàng)建適用于所有 .NET 實(shí)現(xiàn)的庫(kù),不僅僅局限于 .NET Core,還包括 Xamarin 和 Unity。在 .NET Standard 1.x 中,我們只對(duì)跨各種實(shí)現(xiàn)已常用的 API 進(jìn)行了建模。在 .NET Standard 2.0 中,我們專注于簡(jiǎn)化將現(xiàn)有 .NET Framework 代碼移植到 .NET Core 的過(guò)程,這樣不僅帶來(lái)了額外的 20,000 個(gè) API,還帶來(lái)了兼容性模式(可便于從基于 .NET Standard 的庫(kù)引用 .NET Framework 庫(kù),而無(wú)需重新編譯它們)。對(duì)于這兩版標(biāo)準(zhǔn),幾乎沒(méi)有任何新組件,因?yàn)樗?API 都是現(xiàn)有 .NET API。
在 .NET Standard 2.1 中,這一情況已有所改變:我們添加了約 3,000 個(gè)幾乎全新的 API,它們作為 .NET Core 開放源代碼開發(fā)的一部分引入。通過(guò)將它們添加到標(biāo)準(zhǔn),我們將它們引入所有 .NET Standard 實(shí)現(xiàn)。
這些新 API 包括:
Span<T>:在 .NET Core 2.1 中,我們添加了 Span<T>,這是類似數(shù)組的類型,允許以統(tǒng)一方式表示托管和非托管內(nèi)存,并支持在不復(fù)制的情況下進(jìn)行切片。Span<T> 是 .NET Core 2.1 中與性能最為相關(guān)的改進(jìn)的核心。因?yàn)樗试S以更高效的方式管理緩沖,所以可以有助于減少分配和復(fù)制。若要詳細(xì)了解此類型,請(qǐng)務(wù)必閱讀 Stephen Toub 關(guān)于 Span<T> 的精彩文章 (msdn.com/magazine/mt814808)。
ValueTask 和 ValueTask<T>:在 .NET Core 2.1 中,基礎(chǔ)內(nèi)容中最重要的功能相關(guān)改進(jìn),可支持高性能方案 (bit.ly/2HfIXob),還能讓 async/await 更高效。ValueTask<T> 已有,可便于在操作同步完成時(shí)返回結(jié)果,而無(wú)需分配新 Task<T>。在 .NET Core 2.1 中,我們進(jìn)一步改進(jìn)了此功能,同時(shí)提高了它的可用性,讓它有對(duì)應(yīng)的非泛型 ValueTask,以便在必須以異步方式完成操作的情況下減少分配,這是 Socket 和 NetworkStream 等類型現(xiàn)在利用的功能。
常規(guī)實(shí)用 API:由于 .NET Core 是開放源代碼的,因此我們跨基類庫(kù)添加了許多小功能,如用于合并哈希代碼的 System.HashCode,或 System.String 上的新重載。.NET Core 中約有 800 名新成員,幾乎所有這些成員都已添加到 .NET Standard 2.1 中。
如需了解更多詳情,請(qǐng)查看 .NET Standard 2.1 公告 (bit.ly/2RCW2fX)。
C# 8.0
C# 8.0 是下一版 C#,它在幾個(gè)主要方面改進(jìn)了語(yǔ)言??梢詾?null 的引用類型有助于防止 null 引用異常,并改進(jìn)了 null 安全編碼做法??梢赃x擇啟用下列功能:在將 null 分配到類型字符串(舉個(gè)例子)的變量或參數(shù)時(shí)看到警告。若要可以為 null,必須使用“string?”可以為 null 的引用類型。
異步流對(duì)異步數(shù)據(jù)流執(zhí)行的操作,就是 async/await 對(duì)單個(gè)異步結(jié)果執(zhí)行的操作。新框架類型 IAsyncEnumerable<T> 是 IEnumerable<T> 的異步版本,同樣也能執(zhí)行 foreach 和 yield return:
public static async IAsyncEnumerable<T> FilterAsync<T>( this IAsyncEnumerable<T> source, Func<T, Task<bool>> predicate) { await foreach (T element in source) { if (await predicate(element)) yield return element; } }
除了其他功能外,借助默認(rèn)接口成員實(shí)現(xiàn),接口可以添加新成員,而無(wú)需中斷現(xiàn)有實(shí)現(xiàn)者。Switch 表達(dá)式可確保模式匹配更為簡(jiǎn)潔,不僅可以遞歸模式,還能將模式深入挖掘到測(cè)試值。如需了解 C# 8.0 的更多詳情,請(qǐng)?jiān)L問(wèn)aka.ms/csharp8。
.NET Framework 和 .NET Core 將如何發(fā)展?
.NET Framework 是在超過(guò) 10 億臺(tái)計(jì)算機(jī)上安裝的 .NET 實(shí)現(xiàn),因此需要盡可能保持兼容性。因此,它的更新速度慢于 .NET Core。甚至安全修復(fù)和 bug 修復(fù)都可能會(huì)導(dǎo)致應(yīng)用程序中斷,因?yàn)閼?yīng)用程序依賴舊行為。我們將確保 .NET Framework 始終支持最新的網(wǎng)絡(luò)協(xié)議、安全標(biāo)準(zhǔn)和 Windows 功能。
.NET Core 是開放源代碼、跨平臺(tái)且快速更新的 .NET 版本。鑒于這種并行本質(zhì),可以對(duì)它應(yīng)用我們無(wú)法冒險(xiǎn)對(duì) .NET Framework 應(yīng)用的更改。也就是說(shuō),隨著時(shí)間推移,.NET Core 會(huì)增添新 API 和語(yǔ)言功能,而 .NET Framework 則不會(huì)。
如果現(xiàn)有 .NET Framework 應(yīng)用程序,且無(wú)需利用任何 .NET Core 功能,就不應(yīng)該有遷移到 .NET Core 的壓力。.NET Framework 和 .NET Core 都將完全受支持;.NET Framework 始終是 Windows 的一部分。甚至在 Microsoft 內(nèi)部,我們都有很多基于 .NET Framework 的大型產(chǎn)品線,并將一直基于 .NET Framework。但展望未來(lái),.NET Core 和 .NET Framework 包含的功能將會(huì)有所不同。
總結(jié)
.NET Core 3.0 預(yù)計(jì)將于 2019 年下半年發(fā)布。它將提供開放源代碼版本的 WinForms 和 WPF,以用于 Windows 桌面開發(fā)。實(shí)體框架 6 也將包含在內(nèi)。此外,ASP.NET Core、Entity Framework Core、.NET Standard 和 C# 都將進(jìn)行重要更新。對(duì)于新 .NET 應(yīng)用程序,應(yīng)認(rèn)真考慮使用此版本的 .NET Core。有關(guān)詳細(xì)信息,請(qǐng)?jiān)L問(wèn)aka.ms/netcore3preview1。
我們對(duì) .NET 的未來(lái)滿懷期待,并將向 .NET Core 添加更多工作負(fù)載。建議大家試用 .NET Core 3.0 預(yù)覽版,并向我們發(fā)送反饋。
原文地址:What's Coming in .NET Core 3.0
原文作者:Scott Hunter
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
對(duì)Entity?Framework?Core進(jìn)行單元測(cè)試
這篇文章介紹了對(duì)Entity?Framework?Core進(jìn)行單元測(cè)試的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03ASP.NET Core 奇淫技巧之偽屬性注入的實(shí)現(xiàn)
這篇文章主要介紹了ASP.NET Core 奇淫技巧之偽屬性注入的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08asp.net System.Net.Mail 發(fā)送郵件
一個(gè)師弟發(fā)了段代碼給我,說(shuō)調(diào)試了很久發(fā)送郵件都沒(méi)有成功。自己使用過(guò)程中,也發(fā)現(xiàn)了很多問(wèn)題,但最簡(jiǎn)單的問(wèn)題是“發(fā)件方”地址根本不支持smtp發(fā)送郵件。2009-04-04ASP.NET Cookie 操作實(shí)現(xiàn)
本節(jié)中的主題描述如何在 ASP.NET Web 應(yīng)用程序中創(chuàng)建 Cookie。Cookie 是一些小的文本文件,服務(wù)器和瀏覽器在收到每個(gè)頁(yè)請(qǐng)求時(shí)交換它們,您還可以使用這些小文本文件來(lái)存儲(chǔ)幫助針對(duì)每個(gè)用戶自定義您的應(yīng)用程序的信息。2009-11-11asp.net c# 調(diào)用百度pai實(shí)現(xiàn)在線翻譯,英文轉(zhuǎn)中文
本文詳細(xì)介紹asp.net c# 調(diào)用百度pai 實(shí)現(xiàn)在線翻譯以及英文轉(zhuǎn)中文實(shí)現(xiàn)代碼,需要了解的朋友可以參考下2012-12-12C#下載文件(TransmitFile/WriteFile/流方式)實(shí)例介紹
C#下載文件想必很多業(yè)內(nèi)人士都不會(huì)陌生吧,C#下載文件方法很多,本文整理了一些,可供大家參考,感興趣的你可以研究下,或許本文所提供的知識(shí)點(diǎn)對(duì)你有所幫助2013-02-02.Net Core WebApi部署在Linux服務(wù)器上的方法
這篇文章主要介紹了.Net Core WebApi部署在Linux服務(wù)器上的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03詳解ASP.NET數(shù)據(jù)綁定操作中Repeater控件的用法
.NET中的Repeater控件支持?jǐn)?shù)據(jù)模板,而且可以自由地定義樣式,這里我們就來(lái)詳解ASP.NET數(shù)據(jù)綁定操作中Repeater控件的用法,需要的朋友可以參考下2016-06-06無(wú)法將類型為“System.Web.UI.WebControls.HiddenField”的對(duì)象強(qiáng)制轉(zhuǎn)換為類型的錯(cuò)誤的解
無(wú)法將類型為“System.Web.UI.WebControls.HiddenField”的對(duì)象強(qiáng)制轉(zhuǎn)換為類型的錯(cuò)誤的解決方法2011-12-12.NET微服務(wù)架構(gòu)CI/CD自動(dòng)構(gòu)建Jenkins+Gitee
這篇文章介紹了.NET使用微服務(wù)架構(gòu)CI/CD自動(dòng)構(gòu)建Jenkins+Gitee的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-01-01