【譯】.NET Core 3.0 中的新變化

来源:https://www.cnblogs.com/leolion/archive/2019/03/23/10585834.html
-Advertisement-
Play Games

.NET Core 3.0 是 .NET Core 平臺的下一主要版本。本文回顧了 .Net Core 發展歷史,並展示了它是如何從基本支持 Web 和數據工作負載的版本 1,發展成為能夠運行 Web、桌面、機器學習、容器、IoT 等的版本 3.0。 .NET Core 1 .NET Core 的歷 ...


.NET Core 3.0 是 .NET Core 平臺的下一主要版本。本文回顧了 .Net Core 發展歷史,並展示了它是如何從基本支持 Web 和數據工作負載的版本 1,發展成為能夠運行 Web、桌面、機器學習、容器、IoT 等的版本 3.0。

.NET Core 1

.NET Core 的歷史可追溯到幾年前,版本 1 是在 2016 年推出,旨在生成第一版開放源代碼和跨平臺(Windows、macOS 和 Linux)的 .NET。靈感來源於只能使用開放源代碼框架的客戶,以及需要在 Linux 伺服器上運行 .NET 應用程式的其他客戶。由於 .NET Core 是跨平臺的,因此根據設計,可使用命令行完成所有操作,而無需使用 IDE。為了應對全局安裝的 .NET Framework 的相容性挑戰,它設計有並行支持,包括隨附作為應用程式一部分的框架,這樣應用程式就不會依賴在電腦上安裝的任何框架。版本 1 隨附新版 ASP.NET、實體框架 (EF) 和主要定目標到的 Web 應用程式。

.NET Core 2

雖然版本 1 支持在新平臺上運行 .NET,但它僅支持一組數量有限的 .NET API。為瞭解決此問題,我們創建了 .NET Standard,它指定了任何 .NET 運行時必須實現的 API,這樣就能跨 .NET 平臺和版本共用代碼和二進位文件了。在 .NET Standard 2.0 中,我們向 .NET Standard 規範添加了超過 20,000 個 API。.NET Core 版本 2 於 2017 年 6 月發佈,並支持 .NET Standard 2.0,使其有權訪問這些 API。我們還引入了 Windows 相容性包,這是包含許多僅 Windows API(如 System.Drawing、System.DirectoryServices 等)的 NuGet 包。ASP.NET Core 2.0 引入了 .NET Core 1.0 中缺少的兩個框架,即 Razor Pages 和 SignalR。Entity Framework Core 開始支持延遲載入,這是一項熱門實體框架功能。.NET Core 2 還在不斷推動 .NET 成為最快的完整堆棧框架之一。TechEmpower 基準由一家獨立公司運行,將 .NET Core 列為原始純文本性能領域的第 7 名,並將它列為 Web 和數據性能 Fortunes 測試中的第 6 名,擊敗了 Java servlet 和 Node.js (bit.ly/2PEE1l1)。

.NET Core 3.0

.NET Core 3.0 是 .NET Core 平臺的下一主要版本。它新增了許多令人興奮的功能,如支持使用 Windows 窗體 (WinForms)、Windows Presentation Foundation (WPF) 和實體框架 6 的 Windows 桌面應用程式。對於 Web 開發,它開始支持使用 C# 通過 Razor 組件(舊稱為 Blazor)生成客戶端 Web 應用程式。此外,它還支持 C# 8.0 和 .NET Standard 2.1。

我們正在 .NET Core 3.0. 中添加對物聯網 (IoT) 方案的支持。現在可以在 Raspberry Pi 和類似設備上對硬體插針(用於控制設備和讀取感測器數據)進行編程,併在所有受支持的 OS 上(例如,使用 Raspberry Pi 或 Arduino)通過串列埠進行通信。我們還在此版本中添加了適用於 ARM64 的 IoT 設備支持,以補充現有 ARM32 功能。

.NET Core 3.0 還將完全支持 ML.NET,這是為 .NET 開發人員生成的開放源代碼機器學習框架。ML.NET 強力驅動 Azure 機器學習、Windows Defender 和 PowerPoint Design Ideas 等產品。使用 ML.NET,可以將許多常用機器學習方案添加到應用中,如情緒分析、建議、預測、圖像分類等。若要瞭解詳細信息,請訪問 bit.ly/2OLRGRQ

我們最近發佈了 .NET Core 3.0 的首個預覽版。若要詳細瞭解 .NET Core 3.0 和試用預覽版,請訪問 aka.ms/netcore3preview1

桌面(WinForms 和 WPF)和開放源代碼

WinForms 和 WPF 是兩個最常用的 .NET 應用程式類型,有數百萬開發人員在使用。.NET Core 3.0 開始支持 WinForms 和 WPF,將 Windows 桌面開發引入了 .NET Core。.NET Core 一直以來都是開放源代碼的,在 GitHub 中這兩個框架與剩餘的 .NET Core 一樣,也都是開放源代碼的。客戶將有史以來第一次能夠見證這些框架的開放開發,甚至可以通過提問、修複 bug 或幫助在 GitHub 中實時開發新功能,從而提供幫助。WinUI XAML 庫也將是開放源代碼的。通過 XAML Islands,可以在 WinForms 和 WPF 應用程式中使用這些控制項。

許多現有 WinForms 和 WPF 應用程式都使用實體框架來訪問數據,因此 .NET Core 也支持實體框架 6。

你可能想要知道,為什麼要在 .NET Core 上生成桌面應用程式。很簡單:這樣才能受益於 .NET Core 中的所有增強功能。不僅可以在最新版框架上生成應用程式,而無需安裝 .NET Core,還能將應用程式和 .NET Core 發佈到一個 .EXE 中。.NET Core 在設計時考慮到了並行支持,因此可以在一臺電腦上安裝多個版本,並能將應用程式鎖定到設計時定目標到的版本。此外,鑒於這種並行本質,可以改進 .NET Core 中的 API(包括 WinForms 和 WPF),而無需承擔損壞應用程式的風險。

ASP.NET Core 3

不過,.NET Core 3.0 並不都是與桌面相關。還有許多令人興奮的新功能是針對 Web 設計的。接下來將介紹我們正在開發的幾項功能。

客戶經常問的一個問題是,如何在 .NET Core 中獲得 RPC 體驗(就像在 .NET 遠程和 Windows Communication Foundation 中一樣)。我們正在參與 gRPC (grpc.io) 項目,以確保 gRPC 能夠為 .NET 開發人員提供一流支持。

在今年早些時候,我們開始了一項試驗,即使用 .NET(我們稱之為 Blazor)進行客戶端 Web 開發。藉助 Blazor,可以編寫直接在瀏覽器中的基於 WebAssembly 的 .NET 運行時內運行的 Web UI 組件,而無需編寫一行 JavaScript。使用 Razor 語法創作組件,這些組件與代碼一起被編譯到常規 .NET 程式集中。然後,程式集和基於 WebAssembly 的 .NET 運行時被下載到瀏覽器中,僅使用開放式 Web 標準就能執行它們(無需任何插件或代碼轉換),如圖 1 所示。

使用 Blazor 進行客戶端 Web 開發 
圖 1:使用 Blazor 進行客戶端 Web 開發

也可以使用 .NET Core 在伺服器上運行相同組件,其中所有 UI 交互和 DOM 更新都是通過 SignalR 連接進行處理,如圖 2 所示。執行後,組件跟蹤 DOM 所需的更新,並通過 SignalR 連接將要應用的這些更新發送到瀏覽器。UI 事件使用同一連接發送到伺服器。此模型的優點有多個:下載大小更小、代碼集中在伺服器上,以及受益於在 .NET Core 上運行組件的所有功能和性能優勢。

使用 SignalR 在伺服器上運行 UI Web 組件 
圖 2:使用 SignalR 在伺服器上運行 UI Web 組件

對於 .NET Core 3.0,我們將把 Blazor 組件模型集成到 ASP.NET Core 中。我們將此集成組件模型稱為“Razor 組件”。Razor 組件開啟了以下新時代:使用 ASP.NET Core 的可組合 UI,以及使用 .NET 的完整堆棧 Web 開發。對於 .NET Core 3.0,Razor 組件最初作為獨立可路由組件,或通過 Razor Pages 和視圖使用的組件在伺服器上運行。不過,相同組件也可以在 WebAssembly 上進行客戶端運行。在開發 .NET Core 3.0 的同時,我們還將繼續著手以下工作:支持使用基於解釋器的 .NET 運行時在 WebAssembly 上運行 Razor 組件,預計將在後續版本中提供。之後,我們還計劃向 WebAssembly 發佈對 .NET 代碼的完全預編譯支持,這將顯著提升運行時性能。

EF Core 3.0

LINQ 是一項用戶鐘愛的 .NET 功能,可便於編寫資料庫查詢,而無需離開所選的語言,同時還能利用豐富的類型信息來獲取 IntelliSense 和編譯時類型檢查。不過,LINQ 也支持編寫數量幾乎不限的複雜查詢,而這對於 LINQ 提供程式來說,一直都是一項巨大挑戰。EF Core 部分解決了此問題,具體方法是支持選擇可轉換為 SQL 的查詢部分,再執行記憶體中剩餘的查詢。在某些情況下,這樣做是可取的,但在其他許多情況下,這可能會導致非常低效的查詢直到應用程式投入生產才被髮現。

在 EF Core 3.0 中,我們計劃深入更改 LINQ 實現工作原理和測試方式,旨在提高它的可靠性(例如,避免破壞修補程式版本中的查詢);讓它能夠將更多表達式正確轉換為 SQL;在更多情況下生成高效查詢;以及防止直到投入生產才被檢測到的非常低效查詢出現。

我們一直在致力於開發適用於 EF Core 的 Cosmos DB 提供程式,以便開發人員能夠熟悉 EF 編程模型,從而輕鬆地將 Azure Cosmos DB 定目標為應用程式資料庫。目標是利用 Cosmos DB 的一些優勢,如全局分發、“始終開啟”可用性、彈性可伸縮性和低延遲,甚至包括 .NET 開發人員可以更輕鬆地訪問它。此提供程式將針對 Cosmos DB 中的 SQL API 啟用大部分 EF Core 功能,如自動更改跟蹤、LINQ 和值轉換。

我們計劃在 EF Core 3.0 中添加的其他功能包括,屬性包實體(將數據存儲在索引屬性(而不是常規屬性)中的實體);能夠將資料庫視圖反向工程為查詢類型;以及與新 C# 8.0 功能集成,如 IAsyncEnumerable<T> 支持和可以為 null 的引用類型。

我們理解,對於許多使用舊版 EF 的現有應用程式來說,移植到 EF Core 的工作量巨大。正因為此,我們還移植了 EF 6,以便能夠使用 .NET Core。

.NET Standard 2.1

如果遵循 .NET Standard,可以創建適用於所有 .NET 實現的庫,不僅僅局限於 .NET Core,還包括 Xamarin 和 Unity。在 .NET Standard 1.x 中,我們只對跨各種實現已常用的 API 進行了建模。在 .NET Standard 2.0 中,我們專註於簡化將現有 .NET Framework 代碼移植到 .NET Core 的過程,這樣不僅帶來了額外的 20,000 個 API,還帶來了相容性模式(可便於從基於 .NET Standard 的庫引用 .NET Framework 庫,而無需重新編譯它們)。對於這兩版標準,幾乎沒有任何新組件,因為所有 API 都是現有 .NET API。

在 .NET Standard 2.1 中,這一情況已有所改變:我們添加了約 3,000 個幾乎全新的 API,它們作為 .NET Core 開放源代碼開發的一部分引入。通過將它們添加到標準,我們將它們引入所有 .NET Standard 實現。

這些新 API 包括:

  • Span<T>:在 .NET Core 2.1 中,我們添加了 Span<T>,這是類似數組的類型,允許以統一方式表示托管和非托管記憶體,並支持在不複製的情況下進行切片。Span<T> 是 .NET Core 2.1 中與性能最為相關的改進的核心。因為它允許以更高效的方式管理緩衝,所以可以有助於減少分配和複製。若要詳細瞭解此類型,請務必閱讀 Stephen Toub 關於 Span<T> 的精彩文章 (msdn.com/magazine/mt814808)。
  • ValueTask 和 ValueTask<T>:在 .NET Core 2.1 中,基礎內容中最重要的功能相關改進,可支持高性能方案 (bit.ly/2HfIXob),還能讓 async/await 更高效。 ValueTask<T> 已有,可便於在操作同步完成時返回結果,而無需分配新 Task<T>。在 .NET Core 2.1 中,我們進一步改進了此功能,同時提高了它的可用性,讓它有對應的非泛型 ValueTask,以便在必須以非同步方式完成操作的情況下減少分配,這是 Socket 和 NetworkStream 等類型現在利用的功能。
  • 常規實用 API:由於 .NET Core 是開放源代碼的,因此我們跨基類庫添加了許多小功能,如用於合併哈希代碼的 System.HashCode,或 System.String 上的新重載。.NET Core 中約有 800 名新成員,幾乎所有這些成員都已添加到 .NET Standard 2.1 中。

如需瞭解更多詳情,請查看 .NET Standard 2.1 公告 (bit.ly/2RCW2fX)。

C# 8.0

C# 8.0 是下一版 C#,它在幾個主要方面改進了語言。可以為 null 的引用類型有助於防止 null 引用異常,並改進了 null 安全編碼做法。可以選擇啟用下列功能:在將 null 分配到類型字元串(舉個例子)的變數或參數時看到警告。若要可以為 null,必須使用“string?”可以為 null 的引用類型。

非同步流對非同步數據流執行的操作,就是 async/await 對單個非同步結果執行的操作。新框架類型 IAsyncEnumerable<T> 是 IEnumerable<T> 的非同步版本,同樣也能執行 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;
  }
}

除了其他功能外,藉助預設介面成員實現,介面可以添加新成員,而無需中斷現有實現者。Switch 表達式可確保模式匹配更為簡潔,不僅可以遞歸模式,還能將模式深入挖掘到測試值。如需瞭解 C# 8.0 的更多詳情,請訪問 aka.ms/csharp8

.NET Framework 和 .NET Core 將如何發展?

.NET Framework 是在超過 10 億台電腦上安裝的 .NET 實現,因此需要儘可能保持相容性。因此,它的更新速度慢於 .NET Core。甚至安全修複和 bug 修複都可能會導致應用程式中斷,因為應用程式依賴舊行為。我們將確保 .NET Framework 始終支持最新的網路協議、安全標準和 Windows 功能。

.NET Core 是開放源代碼、跨平臺且快速更新的 .NET 版本。鑒於這種並行本質,可以對它應用我們無法冒險對 .NET Framework 應用的更改。也就是說,隨著時間推移,.NET Core 會增添新 API 和語言功能,而 .NET Framework 則不會。

如果現有 .NET Framework 應用程式,且無需利用任何 .NET Core 功能,就不應該有遷移到 .NET Core 的壓力。.NET Framework 和 .NET Core 都將完全受支持;.NET Framework 始終是 Windows 的一部分。甚至在 Microsoft 內部,我們都有很多基於 .NET Framework 的大型產品線,並將一直基於 .NET Framework。但展望未來,.NET Core 和 .NET Framework 包含的功能將會有所不同。

總結

.NET Core 3.0 預計將於 2019 年下半年發佈。它將提供開放源代碼版本的 WinForms 和 WPF,以用於 Windows 桌面開發。實體框架 6 也將包含在內。此外,ASP.NET Core、Entity Framework Core、.NET Standard 和 C# 都將進行重要更新。對於新 .NET 應用程式,應認真考慮使用此版本的 .NET Core。有關詳細信息,請訪問 aka.ms/netcore3preview1

我們對 .NET 的未來滿懷期待,並將向 .NET Core 添加更多工作負載。建議大家試用 .NET Core 3.0 預覽版,並向我們發送反饋。

 


原文作者:Scott Hunter

原文地址:What's Coming in .NET Core 3.0


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、如果不聲明編碼,則中文會報錯,即使是註釋也會報錯。只要寫中文,必須加一句:# -- coding:utf-8 --。原因:答案在PEP-0263裡面有所提及,那就是Emacs等編輯器使用這種方式進行編碼聲明。 2、文檔編碼是一種告訴程式——無論是電腦的操作系統還是Python 代碼——讀取文檔 ...
  • 文本 string:通用字元串操作 re:正則表達式操作 difflib:差異計算工具 textwrap:文本填充 unicodedata:Unicode字元資料庫 stringprep:互聯網字元串準備工具 readline:GNU按行讀取介面 rlcompleter:GNU按行讀取的實現函數 二 ...
  • application.properties ...
  • 數組作為方法參數傳遞時,傳遞的是數組在記憶體中的地址。因此在方法內部改變數組值也是有效的,會改變實際參數的值。 ...
  • 面試題 如果讓你寫一個消息隊列,該如何進行架構設計?說一下你的思路。 面試官心理分析 其實聊到這個問題,一般面試官要考察兩塊: 你有沒有對某一個消息隊列做過較為深入的原理的瞭解,或者從整體瞭解把握住一個消息隊列的架構原理。 看看你的設計能力,給你一個常見的系統,就是消息隊列系統,看看你能不能從全局把 ...
  • 為了給列表框配備滾動條,看來很多別人的博客 終於解決了問題 ,現在我總結一下 效果圖 關鍵在標記紅色的兩句,為了讓兩個控制項相互配合,兩個控制項都得設置 lb.config(yscrollcommand=scr.set) 列表框換“視角”後 更新的滾動條狀態scr.config(command=lb.y ...
  • 從0到1:使用Caliburn.Micro(WPF和MVVM)開發簡單的計算器 之前時間一直在使用Caliburn.Micro這種應用了MVVM模式的WPF框架做開發,是時候總結一下了。 Caliburn.Micro(Caliburn.Micro框架概述 https://blog.csdn.net/ ...
  • 需要安裝nuget包Microsoft.Packaging.Tools.Trimming然後利用如下命令發佈dotnet publish -r win10-x64 -c release --self-contained true /p:TrimUnusedDependencies=true發佈完成之 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...