NET Core 3.0 正式公布:新特性詳細解讀

2019-09-30

作者丨Richard Lander   譯者丨核子可樂    策劃丨趙鈺瑩

近日,.NET Core 3.0 正式發(fā)布。此次新版本包含一系列重要改進,添加了 Windows Forms 與 WPF、添加新的 JSON API、對 ARM64 的支持能力以及全面提高的性能水平等。此外,C# 8 也是此次新版本的重要組成部分,其中包含可空、異步流以及更多模式。F# 4.7 則專注于放寬語法限制,并專門匹配 .NET Standard 2.0。開發(fā)者現在可以立即將原有項目更新為 .NET Core 3.0,此次新版本與原有版本兼容,大家可以放心體驗。

QQ圖片20190930112954.png

根據微軟博客的介紹,開發(fā)者可以面向 Windows、MacOS 以及 Linux 等系統平臺下載 .NET Core 3.0 :

.NET Core 3.0 SDK 與運行時

Snap 安裝程序

Docker 鏡像

此外, ASP .NET Core 3.0 與 EF Core 3.0 也已經一同發(fā)布。Visual Studio 2019 16.3 與 Visual Studio for Mac 8.3 亦同時發(fā)布,且需要更新才能確保 .NET Core 3.0 與 Visual Studio 的協同使用。.NET Core 3.0 為 Visual Studio 2019 16.3 中的組成部分,開發(fā)者可以選擇直接升級至 Visual Studio 2019 16.3,從而立刻獲取 .NET Core。

感謝所有為 .NET Core 3.0 做出貢獻的朋友們!此次最新版本的發(fā)布源自數百位團隊成員的努力,也包括技術社區(qū)的重大貢獻。

發(fā)行說明:

.NET Core 3.0 發(fā)行說明

.NET Core 2.2 -> 3.0 API 的區(qū)別

.NET Core 3.0 貢獻者名單

GitHub 發(fā)行版

關于 .NET Core 3.0 的 GitHub 問題解答

1

3.0 版本,開發(fā)者需要了解什么?

在深入探究 .NET Core 3.0 中的全部新功能之前,我們首先需要強調幾項關鍵性的改進與指導內容。以下是整理出的要點清單:

.NET Core 3.0 已經在 dot.net 以及 Bing.com 上托管了幾個月,通過了一系列嚴苛的測試。眾多其他微軟團隊也將很快在生產流程當中通過 .NET Core 3.0 部署一系列大型工作負載。

多種組件的性能得到顯著提升,感興趣的朋友可以點擊此處參閱 .NET Core 3.0 的性能改進說明。

C# 8 加入了異步流、范圍 / 索引、更多模式以及可為空的引用類型??蔀榭找馕吨梢灾苯影l(fā)現那些導致 NullReferenceException 問題的代碼缺陷??蚣軒斓淖畹讓幼⑨屢惨烟砑油瓿桑詭椭私夂螘r為 Null。

F# 4.7 致力于通過隱式 yield 表達式及相關語法降低某些操作的實現難度。其中還包含對 LangVersion 的支持,提供 nameof 并可以預覽形式打開靜態(tài)類。F# Core 核心庫現在還與 .NET Standard 2.0 相匹配。您可以點擊此處參閱 F# 4.7 發(fā)布公告中的細節(jié)信息。

.NET Standard 2.1 增加了可與 .NET Core 以及 Xamarin 共同使用的代碼類型集。.NET Standar 2.1 當中包含 .NET Core 2.1 以及之后版本中的所有類型。

Windows 桌面應用現已面向 Windows Forms 與 WPF(開源)得到 .NET Core 支持。其中,WPF 設計器為 Visual Studio 2019 16.3 版本中的組成部分。Windows Forms 設計器仍處于預覽狀態(tài),并可通過 VSIX 下載的形式獲取。

.NET Core 應用現在默認具備可執(zhí)行文件。在以往的發(fā)行版中,應用需要通過 dotnet 命令方啟動,例如 dotnet myapp.dll?,F在,可以通過應用特定可執(zhí)行文件實現應用啟動,例如 myapp 或者./myapp,具體視使用的操作系統而定。

高性能 JSON API 加入新版本,適用于 reader/writer、對象模型以及序列化場景等。這些 API 在 Span 基礎之上重新構建而成,且在底層使用 UTF8(而非 string 等 UTF16)。這些 API 能夠將分配需求控制在最低程度,從而提高性能、減少垃圾收集器的工作量。具體請參閱.NET Core 3.0 中的 JSON 未來發(fā)展說明。

默認情況下,垃圾收集器的內存占用量得到了顯著削減。對于將眾多應用程序托管在同一服務器之上的使用場景,這項改進可謂意義重大。垃圾收集器本身也得到了更新,能夠利用 64 核及以上設備的大量計算核心。

.NET Core 已針對 Docker 進行了增強,以使 .NET 應用程序能夠在容器中以可預測的方式高效運作。在容器配置中的內存或 CPU 資源有限時,目前的垃圾收集器與線程池更新結果也能帶來更好的運作效果。.NET Core docker 鏡像也變得更小,其中 SDK 鏡像的瘦身效果尤其明顯。

Raspberry Pi 與 ARM 芯片現已得到支持,可配合遠程 Visual Studio 調試程序等工具實現物聯網開發(fā)。開發(fā)者可部署應用以監(jiān)聽各傳感器,同時將消息或者圖像輸出至顯示器上,整個過程皆可通過新的 GPIO API 實現。ASP.NET 則可用于將數據公布于 API 或者以站點的形式對物網設備進行配置。

.NET Core 3.0 即為“當前”版本,我們計劃在 2019 年 11 月推出下一代 .NET Core 3.1 版本。.NET Core 3.1 將為長期支持(LTS)版本(周期至少為 3 年)。我們建議您首先采用 .NET Core 3.0,而后更新至 3.1 版,升級過程將非常輕松。

.NET Core 2.2 將于今年 12 月 23 日停止服務,具體情況請參閱 .NET Core 支持策略。

.NET Core 3.0 將通過 RHEL 8 的紅帽 Applicaltion Streams 交付,這也是我們與紅帽公司多年合作的最新成果。

對于希望在 Windows 上使用 .NET Core 3.0 的用戶,將必須升級至 Visual Studio 2019 16.3。

對于希望在 Mac 上使用 .NET Core 3.0 的用戶,將必須升級至 Visual Studio for Mac 8.3。

Visual Studio Code 用戶應始終使用最新版本的 C# 擴展,以確保能夠正常支持最新方案,包括與 .NET Core 3.0 的匹配。

.NET Core 3.0 的 Azure App Serivce 部署目前正在進行當中。

.NET Core 3.0 的 Azure Dev Ops 部署即將推出。我們將在準備就緒之后發(fā)布更新。

平臺支持

.NET Core 3.0 將在以下操作系統平臺上得到支持:

Alpine: 3.9+

Debian: 9+

openSUSE: 42.3+

Fedora: 26+

Ubuntu: 16.04+

RHEL: 6+

SLES: 12+

macOS: 10.13+

Windows Client: 7, 8.1, 10 (1607+)

Windows Server: 2012 R2 SP1+

備注:Windows Forms 與 WPF 應用只適用于 Windows 操作系統。

芯片支持情況:

x64,Windows、macOS 以及 Linux

x86,Windows

ARM32,Windows 與 Linux

ARM64,Linux (kernel 4.14+)

備注:請確保 .NET Core 3.0 ARM64 部署方案采用 Linux 內核 4.14 或者更新版本。例如,Ubuntu 18.04 能夠滿足這一條件,但 16.04 版本無法支持。

WPF 與 Windows Forms

開發(fā)者可以在 Windows 系統上利用 .NET Core 3 構建 WPF 與 Windows Forms 應用從項目起步之初,我們就制定了強大的兼容性目標,旨在保證桌面應用程序能夠從 .NET Framework 輕松遷移至 .NET Core 當中。我們已經收到眾多開發(fā)人員的反饋,了解到他們已經成功將自己的應用遷移至 .NET Core 3.0,且整個流程非常輕松便捷。從了盡可能降低對開發(fā)人員的影響,WPF 以及 Windows Forms 沒有受到任何影響,其仍可在 .NET Core 上正常運行。事實上,項目本身進行了重大調整,但我們認為不對用戶造成影響才是最好的調整方式。

下圖所示為一款 .NET Core Windows Forms 應用:

QQ圖片20190930113120.png


Visual Studio 2019 16.3 已經支持創(chuàng)建能夠匹配 .NET Core 的 WPF 應用。其中包括新的模板、經過更新的 XAML 設計器以及 XMAL Hot Reload。該設計器類似于現有 XAML 設計器(能夠匹配.NET Framework),但二者在體驗上仍然略有不同。

從技術層面來看,最大的區(qū)別在于面向 .NET Core 的設計器采用新的接口進程(wpfsurface.exe)以僅運行針對 .NET Core 版本的運行時代碼。以往,.NET Framework WPF 設計器進程(xdesproc.exe)本身即為承載設計器的 WPF .NET Framework 進程;由于運行時不兼容,我們無法使用 WPF .NET Framework 進程(在本示例為中 Visual Studio)將兩個版本的 .NET(即 .NET Framework 與 .NET Core)加載至同一進程當中。這意味著設計器在一定程度上(例如設計器擴展)無法以同樣的方式運作。如果正在編寫設計器擴展,我們建議認真閱讀 XAML 設計器擴展遷移文檔。

下圖所示為顯示在新設計器當中的 WPF 應用:

微信圖片_20190930113238.png


Windows Forms 設計器目前仍處于預覽狀態(tài),可以單獨進行下載。其將在后續(xù)更高版本內被添加至 Visual Studio 當中。該設計器的當前預算版包含對最常用控件以及底層功能的支持。我們將通過每月更新不斷對該設計器做出更新。我們目前不建議大家將自己的 Windows Forms 應用程序移植至 .NET Core,特別是在高度依賴設計器的情況下。希望開發(fā)者體驗目前的設計器預覽版,并積極向我們反饋問題。

另外,大家也可以利用 .NET CLI 通過命令行進行桌面應用程序的創(chuàng)建與構建。例如,您可以通過以下命令快速創(chuàng)建一個新的 Windows Forms 應用:

您也可以利用同樣的流程創(chuàng)建 WPF 應用:

早在 2018 年 12 月,我們就將 Windows Forms 與 WPF 轉化為開源項目。很高興看到,目前技術社區(qū)以及 Windows Forms 及 WPF 團隊正共同努力以改進這兩套 UI 框架。在 WPF 方面,我們最初在 GitHub 庫中只擁有少量代碼,但目前幾乎全部 WPF 代碼都已經發(fā)布至 GitHub。隨著時間的推移,未來還將有更多組件出現。與其他 .NET Core 項目一樣,這些新的庫將成為 .NET Foundation 的一部分,并遵循 MIT 開源許可。

System.Windows.Forms.DataVisualization 軟件包(包含圖表控件)目前也適用于新的 .NET Core 版本。大家現在可以將這些控制添加到您的 .NET Core WinForms 應用程序當中。該圖表控件的源代碼可從 Github 上的 dotnet/winforms-datavisualization 處獲取。控件本身已經進行了調整,以簡化面向 .NET Core 3 的移植過程,但我們并不打算對其做出大規(guī)模更新。

Windows 原生互操作

Windows 以常規(guī) API、COM 以及 WinRT 的形式提供豐富的原生 API。我們也從 .NET Core 1.0 時代起即提供對 P/Invoke 的支持;在此次 .NET Core 3.0 當中,我們進一步添加了 CoCreate COM API、主動 WinRT API,以及將托管代碼以 COM 組件形式處理等功能。很多開發(fā)人員都就這些功能向我們提出申請,我們相信其正式推出也將給大家的日常工作帶來巨大便利。

去年下半年,我們宣布已經設法通過 .NET Core 實現了 Excel 自動化。那絕對是個有趣的時刻。在底層,我們的展示利用到 COM 互操作機制,例如 NOPIA、對象等效性以及自定義編組器等等?,F在,您可以在擴展示例當中親自體驗多種相關演示方案。

目前,.NET Core 3.0 只部分支持托管 C++ 與 WinRT 互操作,完整的支持能力將在 .NET Core 3.1 當中推出。

可空引用類型

C# 8.0 當中引入了可空與不可空兩種新的引用類型,這意味著用戶可以對引用類型變量的屬性做出重要聲明:

某項引用不應為空。當變量不應為空時,則編譯器會強制執(zhí)行規(guī)則以確保安全地撤銷針對空變量的引用,而無需預先檢查引用目標是否為空。

某項引用可以為空。當變量可以為空時,編譯器會強制執(zhí)行規(guī)則以確保您已經對所引用的變量是否為空做出檢查。

相較于無法從引用變量的變量聲明當中確定設計意圖的早期 C# 版本,此次發(fā)布的新功能具有明顯的優(yōu)勢。通過添加可空這一全新引用類型,您將能夠更明確地聲明自己的設計意圖,而編譯器則可以幫助您正確地完成這一目標并及時發(fā)現代碼中的錯誤。

接口成員的默認實現

目前,一旦接口發(fā)布完畢,您將無法對其做出任何變更:換言之,要向其中添加新成員,我們就必然會對現有界面的實現成員造成破壞。

在 C# 8.0 當中,大家可以為某一接口成員提供主體。結果就是,如果實現該接口的類沒有實現該成員(可能是因為編寫代碼時還不存在該成員),那么調用代碼將只能獲得默認的實現效果。

在本示例當中,ConsoleLogger 類并不需要實現對 ILogger 中的 Log(Exception) 重載,因為其是通過默認實現進行聲明的?,F在,只要為現有實現成員提供默認實現,您就可以隨時向現有接口添加新的成員。

異步流

現在,您可以利用 IAsyncEnumerable 對異步數據流進行 foreach。這一新的接口滿足了眾多開發(fā)人員的長久需求,也就是 IEnumerable 的異步版本。該語言允許大家對任務進行 await foreach 以使用其元素。在產生方面,您的 yield return 條目可能會產生異步流。雖然聽起來似乎比較復雜,但其實際上將在實踐當中顯著簡化操作。

以下示例展示了異步流的產生與使用情況。其中的 foreach 聲明為異步,其本身會利用 yield return 為調用程序產生一條異步流。這種利用 yield return 的模式亦是我們推出的異步流標準生產方式。

除了能夠實現 await foreach 之外,大家也可以創(chuàng)建出異步迭代器,例如一個能夠返回 IAsyncEnumerable/IAsyncEnumerator 并在其中同時實現 await 與 yield return 的迭代器。對于需要處理的對象,您也可以使用能夠實現 Stream 以及 Timer 等多種框架類型的 IAsyncDisposable。

索引與范圍

我們還創(chuàng)建了新的語法與類型,可用于描述索引器、數組元素訪問或者可以直接進行數據訪問的任何其他類型。其中包括對單一值(索引的通常定義)或者兩個值(描述范圍)的支持。

Index 是一種用于描述數組索引的新類型。您可以從通過 int 從零開始對 Index 進行計數,也可以使用 ^ 前綴運算符創(chuàng)建索引。在以下示例中,我們可以同時觀察到這兩種情況:

Range 的概念基本相同,其由兩個 Index 值構成,其一代表開始、其二代表結束,且可以用 x…y 的范圍表達式編寫。接下來,大家即可使用 Range 索引以生成底層數據的一個切片,具體如下所示:

使用聲明很多朋友可能已經厭倦了使用那些要求縮進代碼的語句,對吧?沒問題,現在不會了。您可以按以下形式編寫代碼,該代碼將在當前語句塊的作用域末尾添加 using 聲明,而后將對象放置在其末尾。

Switch 表達式

幾乎每一位 C# 用戶都非常喜歡 switch 語句的概念,但卻不太喜歡它的語法。C# 8 引入了 switch 表達式,該表達式可實現以下功能:

terser 語法

由于其屬于表達式,所以會返回一個值

與模式匹配全面集成

Switch 表達式中的關鍵字為“infix”,意味著該關鍵字位于測試值(在第一個示例中為 0)與示例列表之間,這種形式與 Lambda 表達式非常相似。

第一個示例對各方法使用了 Lambda 語法,該語法能夠與 switch 表達式良好集成,但并非必需。

在此示例中,共有兩種模式在發(fā)揮作用。首先,0 會與 Point 類型模式匹配,而后再與內的屬性模式匹配。_ 用于描述丟棄模式,其與 switch 語句的默認模式想再。

大家也可以更進一步依賴元組解構與參數位置,具體如下所示:

在本示例中,大家可以看到我們并不需要為每一種情況定義變量或者顯式類型。相反,編譯器可以將當前正在測試的元組與已經定義的元組進行匹配。

所有這些模式,使得我們能夠編寫出意圖更加明確的聲明性代碼,而非單純執(zhí)行測試的過程代碼。編譯器能夠負責實現無聊的過程代碼,并保證其始終得到正確執(zhí)行。

當然,在某些情況下,switch 語句的實際效果可能仍然優(yōu)于新的 switch 表達式與模式中的語法形式。

速度更快的 JSON API

.NET Core 3.0 當中包含一個新的 JSON API 家族,其用于實現 reader/writer 場景、利用文檔對象模型(DOM)實現隨機訪問外加一個序列化程序。大家可能已經非常熟悉如何使用 Json.NET 。新的 API 旨在滿足大多數同類場景需求,但內存需求更低、執(zhí)行速度更快。

簡而言之,我們希望構建一個新的 JSON API,從而充分利用.NET Core 中的所有全新性能優(yōu)勢,并以此為基礎全面提升性能水平。很明顯,我們不可能在保持現有代碼庫(例如 Jason.NET )兼容性的同時達成這一目標。

下面,讓我們分層對這一新的 API 家族做出闡述。

Utf8JsonReader

System.Text.Json.Utf8JsonReader 是種面向面向 UTF-8 編碼 JSON 文本的高性能、低分配、純轉發(fā)讀取器,負責從 ReadOnlySpan 當中讀取內容。Utf8JsonReader 是一種基礎的低級類型,我們可以利用它構建自定義解析器與解串器。利用新的 Utf8JasonReader,對 JSON 負載的讀取速度將可達到以往 Json.NET 中讀取速度的兩倍。另外,除非大家需要將 JSON 令牌實現為(UTF16)字符串,否則其不會進行分配。

Utf8JsonWriter

System.Text.Json.Utf8JsonWriter 提供一種高性能、非緩存、純轉發(fā)方式,可用于將 String、Int32 以及 DateTime 等常規(guī).NET 類型寫入為 UTF-8 編碼 JSON 文本。與 reader 類似,writer 是一種基礎低級類型,開發(fā)人員可以利用它構建自定義序列化程序。使用新的 Utf8JasonWriter,JSON 負載的編寫速度將比 Json.NET 寫入器高 30% 到 80%,且不進行分配。

JsonDocument

System.Text.Json.JsonDocument 能夠對 JSON 數據進行解析,并建立只讀文檔對象模型(DOM)功能,用以查詢該對象以支持隨機訪問與枚舉。其建立在 Utf8JasonReader 基礎之上,組成數據的 JSON 元素可以通過由 JsonDocument 類型(被稱為 RootElement 屬性)公開的 JsonElement 類型進行訪問。JsonElement 當中包含 JSON 數組與對象枚舉器,外加用于將 JSON 文本轉換為常見.NET 類型的 API。利用 JsonDocument,對常規(guī) JSON 負載進行解析并訪問其中各成員的速度,一般可以達到以往 Json.NET 的 2 到 3 倍;而且由于數據本身大小合理(小于 1 MB),因此幾乎不需要進行數據分配。

JSON 序列化器

System.Text.Json.JsonSerializer 層位于高性能 Utf8JsonReader 與 Utf8JsonWriter 之上。其負責對來自 JSON 的對象進行反序列化,并對指向 JSON 的對象進行序列化。內存分配得到嚴格控制,同時支持利用 Stream 以異步方式進行 JSON 讀取與寫入。

引入全新 SqlClient

SqlClient 是一款數據提供程序,您可以利用它直接利用 ADO .NET API 訪問微軟 SQL Server 以及 Azure SQL Database 等。SqlClient 已經正式發(fā)布,并通過 Microsoft.Data.SqlClient NuGet 工具包進行更新,且同時支持 .NET Freamework 與 .Net Core 應用程序。通過使用 NuGet,SQL 團隊將能夠更輕松地為 Freamework 與 .Net Core 用戶提供更新。

ARM 與物聯網支持

我們在本次發(fā)行版當中實現了對 Linux ARM64 的支持,這也是對此前 .NET Core 2.1 與 2.2 版本當中面向 Linux 與 Windows 提供 ARM32 支持能力的延續(xù)。雖然某些物聯網工作負載能夠發(fā)揮我們現有 x64 功能提供的優(yōu)勢,但仍有不少用戶強烈要求發(fā)布 ARM 支持功能?,F在這一功能已經落實到位,我們也在與計劃進行大規(guī)模部署的客戶開展廣泛合作。

不少利用.NET 的物聯網部署場景涉及邊緣設備,且完全面向網絡。其他一些場景則要求對硬件進行直接訪問。在本次發(fā)行版中,我們添加了新的功能以在 Linux 上使用串行端口,同時可利用 Raspberry Pi 等設備上的數字引腳功能。該引腳使用多項協議。我們還添加了對 GPIO、PWM、I2C 以及 SPI 的支持,以支持讀取傳感器數據、以無線方式交互并將文本與圖像輸出至顯示器等功能。

此功能屬于以下軟件包中的組成部分:

System.Device.Gpio

Iot.Device.Bindings

作為 GPIO(及其他同類協議)支持的一部分,我們審視了以往版本中的原有元素。我們發(fā)現其中的 C# 與 Python API,在這兩種場景下 API 都屬于原生庫上的打包器,而這些庫則采用 GPL 許可。我們認為這種方法缺乏可持續(xù)性。因此,我們構建了 100% 純 C# 解決方案以實現這些協議,這意味著我們的 API 可以在支持 .NET Core 的任何環(huán)境下運作,利用 C# 調試器(通過 sourcelink)進行調試,并支持多種底層 Linux 驅動程序(包括 sysfs、libgpoid 以及其它針對特定主板的驅動程序)。所有代碼皆遵循 MIT 許可。與現有技術相比,我們認為這種新方法將給.NET 開發(fā)人員帶來巨大的便利。

.NET Core 運行時前滾策略更新

現在,.NET Core 運行時(更具體地講,運行時綁定程序)開始提供主版本的前滾選擇策略。運行時綁定程序將默認啟用面向補丁與次版本的前滾功能。我們決定公開一組更為廣泛的策略,以幫助開發(fā)人員快速恢復可能存在的更新問題,但原有前滾操作并不受影響。

我們發(fā)布了一項名為 RollForward 的新屬性,該屬性能夠接受以下值:

LatestPatch——前滾至最新補丁版本。其會禁用 Minor 策略。

Minor ——前滾至最早次版本以解決所需次版本缺失問題。如果該次版本存在,則 LatesPatch 策略即可起效。這也是系統中采用的默認策略。

Major ——前滾至最早主版本與最早次版本,以解決所需主版本缺失問題。如果該主版本存在,則隨后使用 Minor 策略。

LatestMinor——前滾至最新次版本,即使存在所請求的次版本亦不受影響。

LatestMajor ——前滾至最新主版本,即使存在所請求的主版本亦不受影響。

Disable ——不進行前滾。僅綁定至指定版本。我們不建議大家在常規(guī)用途中使用這一選項,因為其會禁用前滾至最新補丁后版本的功能。僅建議您在測試環(huán)境中使用。

Docker 與 cgroup 限制

很多開發(fā)人員都在利用容器技術打包并運行自己的應用程序。其中的一大重要問題,在于容器的 CPU 或者內存等資源可能受到限制。我們早在 2017 年就實現了對內存限制功能的支持,遺憾的是,我們發(fā)現該實現的主動性不足以將容器環(huán)境以可靠方式保持在配置限制之下,意味著即使設置了內存限制(特別是小于 500 MB 的情況),應用程序仍然有可能出現 OOM 問題。我們已經在 .NET Core 3.0 當中修復了這一問題。這一改進意義重大,我們強烈建議使用 .NET Core Docker 的用戶升級至 .NET Core 3.0。

Docker 資源限制功能構建在 cgroup 基礎之上,而 cgroup 又是一項 Linux 內核功能。從運行時的角度來看,我們需要以 cgroup 基元為目標。

大家可以利用 docker run -m 參數來限制容器的可用內存,如下所示,此示例用于創(chuàng)建一個基于 Alpine 且內存容量為 4 MB 的容(而后輸出內存限制):

我們還添加了新的變更,以更好地支持 CPU 限制(–cpus)。其中包括更新運行時對十進制 CPU 值進行四舍五入的方式。如果將—cpus 設置為(足夠)接近某個較小的整數(例如 1.499999999)的值,則運行時會對該值進行四舍五入(這種情況下將四舍五入為 1)。結果就是,運行時所使用的 CPU 數量低于需求,從而導致 CPU 資源不足。通過對該值進行直接進位,運行時在理論上會增加 OS 線程調度程序的壓力,但即使是在最極端的情況下(–cpus=1.000000001,以往 其會被四舍五入為 1,但現在會直接進位為 2),我們也沒有發(fā)現 CPU 出現任何性能下降。

下一步是確保線程池遵循 CPU 限制。線程池算法中有一部分負責計算 CPU 的繁忙時間,也就是計算可用 CPU 容量。通過在計算 CPU 繁忙時間當中考慮 CPU 限制,我們得以避免線程池在爭用中執(zhí)行的各種試探操作:一種方法可能嘗試分配更多線程以增加 CPU 繁忙時間;但另一種方法則可能嘗試分配更少線程,以避免不必要的線程浪費。

默認情況下降低 GC 堆大小

在致力于改善對 docker 內存限制支持能力的同時,我們也受到了啟發(fā),并著手對通用 GC 策略加以更新,旨在為更為廣泛的應用程序的內存使用率帶來改善(即使未運行在容器之內)。這些變更使得第 0 代預算分配能夠更好地與現代處理器的緩存大小及緩存層級保持一致。

我們的團隊成員 Damian Edwards 注意到,ASP.NET 基準測試的內存使用量減少了一半,但其它性能指標并未出現任何負面影響。這是一項驚人的進步!如他所言,這些將成為新的默認設置,且不需要對您的代碼做出任何修改(只需采用 .NET Core 3.0 即可)。

當然,我們在 ASP.NET 基準測試中觀察到的內存節(jié)約效果,可能代表 / 不代表您的實際體驗。我們希望聽到更多朋友在實際應用程序內存使用量方面觀察到的結果。

改善對多處理器設備的支持能力

基于 .NET 的 Windows 傳統,GC 需要配合 Windows 處理器組概念才能支持包含 64 塊以上處理器的計算機。這一實現早在 5 到 10 年前的 .NET Framework 當中即已完成。但利用 .NET Core,我們最初選擇了 Linux PAL 以實現類似的概念——雖然 Linux 當中不存在這一原生概念。此后,我們在 GC 當中放棄了這一概念,并將其轉化為 Windows APL。

GC 現在公開了一個配置開關,即 GCHeapAffinitizeRanges,用于在包含 64 個以上處理器的計算機上指定相似的掩碼。

GCLarge Page 支持

Large Pages 或者叫 Huge Pages 是一項功能,操作系統可利用其構建起大于原生頁面大?。ㄍǔ?4K)的內存區(qū)域,從而提高調用這些大頁面的應用程序的性能表現。

當發(fā)生虛擬到物理地址的轉換時,系統會首先查詢(通常為并行)被稱為轉換后備緩沖區(qū)(TLB)的高速緩存,以檢查是否存在可用于所訪問虛擬地址的可用物理翻譯,以避免進行可能占用大量資源的頁面移動操作。每個大頁面翻譯都需要使用 CPU 內部的一個翻譯緩沖區(qū)。該緩沖區(qū)的大小通常要比本地頁面大三個數量級;這能夠極大提高轉換緩沖區(qū)的效率,從而改善內存在頻繁訪問下的性能。在具有雙層 TLB 的虛擬機當中,這一改進顯得尤為重要。

GC 現在能夠利用 GCLargePages 選項功能進行配置,從而選擇在 Windows 上分配大頁面。利用大頁面能夠減少 TLB 遺漏,進而在總體上提高應用程序的性能;但是,這項功能也有著自己的局限,應當認真考量。Bing.com 就采用了這項功能,并切實獲得了性能提升。

.NET Core 版本 API

我們在.NET Core 3.0 當中對.NET Core 版本 API 做出改進,現在它們能夠返回您所需要的版本信息。這些變更雖然在客觀上帶來了便利,但卻存在技術破壞性,而且有可能影響到依賴現有版本 API 獲取各類信息的應用程序。

現在,大家可以訪問以下版本信息:

Event Pipe 改進 Event Pipe 現在支持多個會話。這意味著大家可以使用 EventListener 在進程內使用事件,同時獲得進程外 event pipe 客戶端。

添加了新的 Perf Counters:

GC 中的時間百分比

Gen 0 堆大小

Gen 1 堆大小

Gen 2 堆大小

LOH 堆大小

分配率

加載組件數量

ThreadPool 線程數量

鎖定爭用率

ThreadPool 工作條目隊列

ThreadPool 已完成工作項比例

現在,大家可以使用同樣的 Event Pipe 基礎設施實現 Profiler 險別。

HTTP/2 支持

現在,我們在 HttpClinet 當中支持 HTTP/2。采用新協議是為了滿足某些 API 的要求,例如 gRPC 與 Apple Push Notification Service。我們希望未來會有更多服務使用 HTTP/2 協議。此外,ASP.NET 也同樣支持 HTTP/2。

備注:首選 HTTP 協議版本將通過 TLS/ALPN 協商,并僅在服務器選擇使用 HTTP/2 時才加以使用。

分層編譯

分層編譯是 .NET Core 2.1 中的一項可選功能,該功能使得運行時能夠更靈活地使用即時(JIT)編譯器,從而在啟動時獲得更佳性能并最大程度提升吞吐量。.NET Core 3.0 在默認情況下即啟用這一功能。去年,我們對該功能做出了一系列改進,包括針對各類工作負載(例如網站、PowerShell 以及 Windows 桌面應用程序)進行測試。性能確實迎來顯著提升,因此我們決定將其作為默認選項。

IEEE 浮點改進

我們對浮點 API 進行了更新,以符合 IEEE 754-2008 修訂版的要求。.NET Core 浮點項目的目標,在于公開所有“必要”運算,以確保其在行為層面符合 IEEE 提出的規(guī)范。

解析與格式化修復:

正確解析并舍入任何長度的輸入。

正確解析并格式化負零。

通過進行不區(qū)分大小寫的檢查,并在適用時允許使用可選前置 + 以正確解析無限與 NaN。

新的 Math API:

BitIncrement/BitDecrement ——對應于 nextUp 與 nextDown IEEE 運算。二者分別返回大于或者小于輸入內容的最小浮點數。例如,Math.BitIncrement(0.0)將返回 double.Epsilon。

MaxMagnitude/MinMagnitude——對應于 maxNumMag 與 minNumMag IEEE 運算,二者分別返回大于或者小于輸入內容的值。例如,Math.MaxMagnitude(2.0 -3.0) 將返回 -3.0。

ILogB ——對應于 logB IEEE 運算,該運算將返回一個整數值,且該值為輸入參數的以 2 為底的整數對數。實際上與 floor(log2(x)) 相同,但舍入誤差最小。

ScaleB——對應于采用整數值的 scaleB IEEE 運算,其相當于返回 x * pow(2,n) 的值,但舍入誤差最小。

Log2——對應于 log2 IEEE 運算,返回以 2 為底的對數,且舍入誤差最小。

FusedMultiplyAdd ——對應于 fma IEEE 運算,負責執(zhí)行積和熔加運算。具體而言,其通過一次運算完成(xy)+ z 運算,同時使舍入誤差最小。以 FusedMultiplyAdd (1e308, 2.0, -1e308) 為例,其返回值為 1e308。常規(guī)(1e308

2.0)-1e308 將返回 double.PositiveInfinity。

CopySign ——對應于 copySign IEEE 運算,其返回 x 的值,但同時帶有 y 符號。

.NET 平臺相關改進

我們添加了一些新的 API,用以訪問某些面向性能的 CPU 指令,包括 SIMD 或 Bit Manipulation 指令集。這些指令能夠在某些場景下實現巨大的性能提升,例如更高效地并行處理數據。除了公開這些可供應用程序使用的 API 之外,我們還開始利用相關指令對.NET 庫進行提速。

以下 CoreCLR PRs 通過實現或者使用的方式展示了一部分內部函數:

實現簡單 SSE2 硬件內部函數

實現 SSE 硬件內部函數

Arm64 Base 硬件內部函數

面向 LocateFound使用 TZCNT 與 LZCNT

現可在 Linux 上支持 TLS 1.3 與 OpenSSL 1.1.1

.NET Core 現在能夠利用 OpenSSL 1.1.1 中的 TLS 1.3 支持能力。TLS 1.3 能夠為 OpenSSL 團隊提供多項優(yōu)勢:

通過減少客戶端與服務器間的往返次數縮短連接時長。

通過消除各種過時及不安全的加密算法、同時加密更多連接握手,以提高安全性。

.NET Core 3. 能夠利用 OpenSSL 1.1.1、OpenSSL 1.1.0 以及 OpenSSL 1.0.2(以及您能夠在 Linux 系統上找到任何最佳版本)。如果客戶端與服務器均支持 TLS 1.3,且 OpenSSL 1.1.1 可用,則 SslStream 與 HttpClinet 類型將在使用 SslProtocols.None 時選擇 TLS 1.3(系統默認協議)。

.NET Core 后續(xù)還將在 Windows 與 MacOS 上支持 TLS 1.3——預計以自動化方式實現,敬請期待。

加密

我們增加了對 AES-GCM 以及 AES-CCM 加密機制的支持,這些加密算法將通過 System.Security.Cryptography.AesGcm 與 System.Security.Cryptography.AesCcm 實現。這些算法皆屬于帶關聯數據的加密認證(AEAD)算法,同時也是首批被添加至 .NET Core 當中的驗證加密(AE)算法。

.NET Core 3.0 現在支持通過標準格式導入及導出非對稱公鑰與私鑰,且無需使用 X.509 證書。

所有密鑰類型(RSA、DSA、ECDsa、ECDiffieHellman)都支持 X.509 SubjectPublicKeyInfo 格式的公鑰,以及 PKCS#8 PrivateKeyInfo 與 PKCS#8 EncryptedPrivateKeyInfo 格式的私鑰。此外,RSA 還支持 PKCS#1 RSAPublicKey 與 PKCS#1 RSAPrivateKey。所有導出方法皆產生 DER 編碼的二進制數據,而導入方法也基本相同;如果某一密鑰以文本友好的 PEM 格式存儲,則調用程序將需要先對內容進行 base64 解碼,而后才能進行方法導入。

PKCS#8 文件可通過 System.Security.Cryptography.Pkcs.Pkcs8PrivateKeyInfo 類進行檢查。

PFX/PKCS#12 文件可分別通過 System.Security.Cryptography.Pkcs.Pkcs12Info 與 System.Security.Cryptography.Pkcs.Pkcs12Builder 進行檢查與修改。

支持新的日本年號(令和)

2019 年 5 月 1 日,日本開始使用新的年號——令和。因此,支持日語日歷的軟件(例如 .NET Core)必須進行更新以支持這一新年號。.NET Core 與 .NET Framework 已經更新,現在可以正確處理新年號下的日文日期格式與解析結果。

.NET 依賴于操作系統或其他更新以正確處理令和日期。如果您或者您的客戶使用 Windows 系統,請下載 Windows 版本的最新更新。如果您運行的是 MacOS 或者 Linux,請下載并安裝支持日本新年號的 ICU 64.2 版本。

Assembly Load Context 改進

關于 AssemblyLoadContext 的改進:

實現上下文命名

添加 ALC 枚舉功能

對 ALC 內程序集進行枚舉的功能

實現類型具體化——旨在簡化實例化(簡單場景不需要自定義類型)

通過將 AssemblyDependencyResolyer 與自定義 AssemblyLoadContext 加以結合,應用程序將能夠在加載插件的過程中,從各個正確位置加載該插件所需要的依賴項,且某一插件的依賴項不會與其他插件的依賴項發(fā)生沖突。

Assembly 可卸載性

Assembly 的可制裁性是 AssemblyLoadContext 中提供的一項新功能。從 API 的角度來看,這項新功能具有極高的透明度,且面向部分新 API 公開。其允許開發(fā)人員對加載程序的上下文進行卸載,從而釋放原本被實例化類型、靜態(tài)字段以及程序集本身所占用的內存。應用程序可以通過這種機制實現程序集的永久加載與卸載,且不會引發(fā)內存泄漏。

我們希望這項新功能被用于以下場景:

需要動態(tài)插件加載與卸載的插件使用場景。

對代碼的動態(tài)編譯、運行以及刷新。適用于網站、腳本引擎等。

加載程序集以進行自我檢查(例如 ReflectionOnlyLoad),但在大多數情況下 MetadataLoadContext 仍然是更好的選擇。

利用 MetadataLoadContext 讀取 Assembly 元數據

我們添加了 MetadataLoadContext,希望在不影響調用程序域的前提下讀取 assembly 元數據。各 assembly 這以數據的形式讀取,其中包括與當前運行時環(huán)境不同的各類架構及平臺上的 assembly。MetadataLoadContext 與 ReflectionOnlyLoad 存在一定交集,但后者僅適用于 .NET Framework。

MetdataLoadContext 目前通過 System.Reflection.MetadataLoadContext 軟件包發(fā)布,其屬于 .NET Standard 2.0 軟件包。

MetadataLoadContext 的適用場景包括設計時功能、構建時工具與運行時點亮功能等需要將一組 assembly 作為數據進行檢查,并在執(zhí)行檢查后釋放所有文件鎖與內存的場景。

Native Hosting 示例

.NET Core 團隊還發(fā)布了一個 Native Hosting 示例,其中展示了在本機應用程序當中托管 .NET Core 的相關最佳實踐。

作為 .NET Core 3.0 中的組成部分,我們現在面向 .NET Core 本地主機公開了這一原本只通過官方 .NET Core 主機為 .NET Core 托管應用程序提供的功能。此項功能主要與 assembly 加載相關,利用這項功能可幫助大家更輕松地構建能夠利用 .NET Core 完整功能集的本地主機。

其他 API 改進

我們曾在 .NET Core 2.1 版本當中對 Span、Memory 以及其他相關類型做出優(yōu)化?,F在,span construction、切片、解析以及格式化等常規(guī)操作的執(zhí)行效果將有所提升。此外,String 等類型也得到了明顯改進,能夠在與 Dictionary 及其他集合共同充當鍵時擁有更好的執(zhí)行效率。所有改進開箱即用,無需對您的代碼做出任何變更。

下面來看其它最新改進:

Brotli 內置 HttpClient 支持能力

ThreadPool.UnsafeQueueWorkItem(IThreadPoolWorkItem)

Unsafe.Unbox

CancellationToken.Unregister

復雜算術運算符

Socket APIs for TCP 仍然有效

StringBuilder.GetChunks

IPEndPoint 解析

RandomNumberGenerator.GetInt32

System.Buffers.SequenceReader

默認情況下,應用程序現在具有原生可執(zhí)行文件

.NET Core 應用程序現在擁有自己的原生可執(zhí)行文件。對于依賴框架的應用程序而言,這是一項前所未有的新功能。在此之前,只有獨立應用程序具有可執(zhí)行文件。這些新的可執(zhí)行文件,將在效果上與此前的原生可執(zhí)行文件保持一致:

您可以雙擊可執(zhí)行文件以啟動對應應用程序。

您可以在 Windows 上使用 myapp.exe,或者在 Linux 及 MacOS 上使用./myapp 通過命令提示符啟動應用程序。

作為 build 的組成部分,新生成的可執(zhí)行文件將與您的操作系統以及 CPU 相匹配。例如,如果您使用的是 Linux x64 計算機,那么可執(zhí)行文件將僅可在該類型的計算機上運行——無法在 Windows 以及 Linux ARM 計算機上運行。這是因為可執(zhí)行文件使用本機代碼(例如 C++)。如果要定位為其他機器類型,則需要在發(fā)布時使用對應的運行時參數。如果愿意,您也可以繼續(xù)使用 dotnet 命令啟動應用程序,而不使用原生可執(zhí)行文件。

利用 ReadyToRun 鏡像優(yōu)化 .NET Core 應用

通過將應用程序 assemblies 編譯為 ReadyToRun(R2R)格式,可以改進 .NET Core 應用程序的啟動速度。R2R 是一種提前(AOT)編譯格式,在 .NET Core 3.0 版本中以可選功能的形式提供。

R2R 二進制文件能夠減少應用程序加載時 JIT 需要完成的工作量,從而提高啟動性能。二進制文件當中包含與 JIT 產生的代碼相似的本機代碼,能夠通過分擔 JIT 的負載壓力帶來更理想的啟動性能。R2R 二進制文件體積較大,因為其中既包含中間語言(IL)代碼(某些情況下仍然需要此代碼),同時包含同一代碼的本機版本,用以改善啟動速度。

要啟用 R2R 編譯:

將 PublishReadyToRun 屬性設置為 true。

使用 RuntimeIdentifie 顯式參數發(fā)布。

備注:在編譯應用程序 assemblies 時,生成的本機代碼將特定于當前平臺與架構(因此,大家在發(fā)布時必須指定有效的 RuntimeIdentifier)。

以下為具體示例:

使用以下命令進行發(fā)布:

備注:RuntimeIdentifier 可設置為其他操作系統或者芯片類型,亦可在項目文件內進行設置。

Assembly Linking

.NET core 3.0 SDK 附帶一款工具,可通過分析 IL 與修剪未使用的 assemblies 以降低應用程序的體積。這是 .NET Core 3.0 中的另一項發(fā)行時可選功能。

在 .NET Core 當中,我們可以隨時發(fā)布包含代碼運行所需的一切元素的自包含應用程序,而無需在部署目標上安裝 .NET。在某些情況下,該應用僅需要框架中的一小部分即可運行,因此修剪掉不必要的框架部分能夠有效降低應用程序體積。我們利用 IL linker 對應用程序的 IL 進行掃描,從而檢測出哪些代碼確有必要,而后對未使用的框架庫進行修剪。這能夠顯著降低某些應用程序的體積。一般來講,小型工具控制臺類應用程序的瘦身效果最為明顯,因為其通常使用框架中的較小子集,且調整難度更低。

要使用 linker 工具:

將 PublishTrimmed 的屬性設置為 true。

將 RuntimeIdentifier 作為顯式參數進行發(fā)布。

以下為相關示例:

使用以下命令進行發(fā)布:

備注:RuntimeIdentifier 可設置為其他操作系統或者芯片類型,亦可在項目文件內進行設置。

根據應用程序代碼的實際調用情況,所發(fā)布的輸出結果將包含框架庫中的一個子集。對于最簡單的 helloworld 應用,linker 工具能夠將應用程序體積縮小 68 MB 到 28 MB。

在修剪之后,需要使用反射或者相關動態(tài)功能的應用程序或者框架(包括 ASP .NET Core 以及 WPF)通常無法正常執(zhí)行,這是因為 linker 無法識別這種動態(tài)行為,因此一般不能確定反射操作在運行時中需要的框架類型。要修剪這類應用程序,大家需要告知 linker 相關代碼當中所依賴的各類工具包或框架以及各種相關信息類型。請確保您在修剪之后對應用程序進行全面測試,我們也正在 .NET 5 當中對這一體驗做出改進。

關于 IL Linker 的更多細節(jié)信息,請參閱說明文檔或者訪問 mono/linker 庫。

備注:在 .NET Core 之前的版本當中,ILLink Tasks 以外部 NuGet 軟件包的形式提供,其中包含多種相同功能。但相關軟件包現已不再受到支持,請更新至 .NET Core 3.0 SDK 以獲取我們?yōu)槟鷾蕚涞娜麦w驗.

Linker 與 R2R 編譯器可同時作用于一款應用程序。一般來講,Linker 能夠使您的應用程序體積更小,而 R2R 則能夠再次恢復其體積,并在性能上帶來顯著提升。大家可以在各種配置當中進行測試,以了解各個選項帶來的具體影響。

發(fā)布單文件可執(zhí)行文件

現在,大家可以利用 dotnet publish 命令發(fā)布單文件可執(zhí)行文件了。這種形式的單一 EXE 實際上是一個自解壓可執(zhí)行文件,其中以資源形式包含所有依賴項(包括本地依賴項)。在啟動時,它會將所有依賴項復制到某個臨時目錄,通過該目錄進行加載。依賴項只需要解壓一次,后續(xù)啟動將速度極快,不再存在任何性能損失。

大家可以通過在項目文件中添加 PublishSingleFile 屬性,或者在命令行中添加新開關的方式啟用這一發(fā)布選項。

要生成獨立的單 EXE 應用程序,以下示例為 64 位 Windows 系統下的命令:

備注:RuntimeIdentifier 可設置為其他操作系統或者芯片類型,亦可在項目文件內進行設置。

若需了解更多細節(jié)信息,請參閱單文件捆綁器說明文檔。

Assembly 修剪器、提前編譯(通過 crossgen)以及單文件捆綁功能皆為 .NET Core 3.0 中提供的全新選項,大家可以根據需求獨立使用或者以組合方式使用。相信一部分用戶可能喜愛通過提前編譯器提供的單 exe 發(fā)布選項,而非我們在.NET Core 3.0 當中提供的自解壓可執(zhí)行文件方法。.NET 5 發(fā)行版當中將正式提供提前編譯器方法。

dotnet build 現在可復制依賴項

dotnet build 現在能夠在 build 操作過程當中,將應用程序中的 NuGet 依賴項從 NuGet 緩存復制到 build 輸出文件夾內。在此版本之前,各依賴項僅能作為 dotnet publish 中的一部分進行復制。此次變更使您能夠利用 xcopy 將 build 輸出至不同計算機當中。

除此之外,您還需要單獨發(fā)布 linking 以及 razor page publishing 等操作。

2

.NET Core 工具:本地安裝

.NET Core 工具也經過更新以支持本地安裝。這些工具比 .NET Core 2.1 版本中的原有全局工具更強大。

本地安裝具有以下特性:

限制工具的使用范圍。

始終使用該工具的某一特定版本,該版本可能不同于全局安裝工具或者其它本地安裝工具。具體基于本地工具 manifest 文件中定義的版本。

可使用 dotnet 命令啟動,例如 dotnet mytool。

備注:請參閱本地工具早期預覽版說明文檔以了解更多細節(jié)信息。

.NET Core SDK 安裝程序現在將就地升級

Windows 版本的 .NET Core SDK MSI 安裝程序將迎來就地升級。這將減少開發(fā)者計算機及生產計算機上所需安裝的 SDK 數量。

此項升級策略將專門針對 .NET Core SDK 功能范圍。各功能范圍在版本號中以最后三位數字中的百位體現,例如 3.0.101 與 3.0.201 代表兩個不同的版本功能范圍,而 3.0.101 與 3.0.199 則處于同一版本功能范圍。

這意味著當 .NET Core SDK 3.0.101 正式發(fā)布并安裝完畢后,.NET Core SDK 3.0.100 將被從計算機中刪除(如果存在)。當 .NET Core SDK 3.0.200 可用并安裝在同一臺計算機上時,.NET Core SDK 3.0.101 則不會被刪除。在這種情況下,系統仍將默認使用 .NET Core SDK 3.0.200,但如果將其配置為通過 global.json 起效,則系統仍然使用 .NET Core SDK 3.0.101(或者更高版本的.1xx 版本)。

這種方法與 global.json 的行為保持一致,允許在各補丁版本之間進行前滾 ,但無法跨越 SDK 功能范圍。因此,通過 SDK 安裝程序并進行升級,可確保應用程序不會因缺少 SDK 而發(fā)生錯誤。對于已經安裝了 Visual Studio 必要 SDK 的用戶,其功能范圍也將與 Visual Studio 安裝情況保持一致。

若需了解更多細節(jié)信息,請參閱:

.NET Core 版本控制

刪除.NET Core SDK 版本

.NET Core SDK 體積改進

在 .NET Core 3.0 當中,.NET Core SDK 的體積明顯更小。主要原因在于,我們轉而采用出于各種目的(引用 assembiles、框架、模板等)的專用“內置包”,從而改變了我們構建 SDK 的方式。在以往的版本(包括 .NET Core 2.2)當中,我們一直利用 NuGet 軟件包構建 SDK,但其中包含大量并不需要的構件,且對存儲空間造成嚴重浪費。

.NET Core 3.0 SDK 體積(括號中為體積變量)

Linux 與 MacOS 版本的體積變化最為顯著,相比之下 Windows 版本的改進較小,這是因為我們在 .NET Core 3.0 當中添加了 WPF 與 Windows Forms。令人驚訝的是,盡管新增了 WPF 與 Windows Forms,安裝程序的體積仍然比原先小了一點。

大家也可以在 .NET Core SDK Docker 鏡像當中感受到這一瘦身效果(僅限于 x64 Debian 與 Alpine)。

大家可以在 .NET Core 3.0 SDK 體積改進文檔中了解我們如何計算這些文件的大小。這里提供詳細的說明,您可以遵循同樣的方法在自己的環(huán)境中運行測試。

Docker 發(fā)布更新

微軟各團隊目前都在面向微軟容器注冊表(MCR)發(fā)布新的容器鏡像。這一變化主要有兩大原因:

將微軟提供的容器鏡像協同至多個注冊表,包括 Docker Hub 與 Red Hat。

利用微軟 Azure 作為全球 CDN 以交付微軟提供的容器鏡像。

在.NET 團隊,我們目前將所有 .NET Core 鏡像發(fā)布至 MCR。我們在 Docker Hub 上維護有自己的主頁,并打算長期保持運營。在另一方面,MCR 并不提供類似的頁面,但可以通過 Docker Hub 等公共注冊表為用戶提供與鏡像有關的信息。Microsoft.dotnet 以及 microsoft.dotnet-nightly 等舊有代碼庫鏈接現在都已經指向新的地址。不過舊有位置中的各鏡像仍將存在,不會被刪除。

在支持生命周期之內,我們將繼續(xù)為 .NET Core 各個版本的代碼庫提供浮動標記服務。例如,2.1-sdk、2.2-runtime 以及 lastest 就屬于此類浮動標記。像 2.1.2-sdk 這類包含三個數字的標簽將不再提供,我們已經在版本號內加以體現。接下來,我們將僅通過 MCR 支持 .NET Core 3.0 鏡像。

例如,現在用于提取 3.0 SDK 鏡像的正確標簽字符串應該為:

新的 MCR 字符串將由 docker pull 以及 Dockerfile FROM 語句共同使用。

感興趣的朋友可以參閱微軟容器注冊表中的現有 .NET Core 鏡像以了解更多細節(jié)信息。

SDK Docker 鏡像中包含 PowerShell Core

應社區(qū)的要求,PowerShell Core 已經被添加至 .NET Core SDK Docker 容器鏡像當中。PowerShell Core 是一套跨平臺(Windows、Linux 以及 MacOS)自動化與配置工具 / 框架,能夠與大家的現有工具良好協作,并針對結構化數據(例如 JSON)CSV、XML 等)、REST API 以及對象模型進行了優(yōu)化。其中包含一個命令行 shell、一種相關腳本語言以及一套用于處理 cmdlets 的框架。

現在,大家可以通過以下 Docker 命令將 PowerShell Core 視為 .NET Core SDK 容器鏡像中的一部分:

目前只有兩種將 PowerShell 引入 .NET Core SDK 容器鏡像的方法,具體如下:

面向任意操作系統利用 PowerShell 語法編寫 .NET Core 應用程序 Dockerfiles。

編寫能夠輕松實現容器化的 .NET Core 應用程序 / 庫構建邏輯。

以下為容器化 build(存儲卷掛載)的 PowerShell 啟動語法示例:

為了讓第二條示例命令正常起效,我們需要在 Linux 上確保.ps1 文件具有以下格式,并需要利用 Unix(LF)而非 Windows(CRLF)作為行尾以執(zhí)行格式化:

備注:PowerShell Core 目前已經作為.NET Core 3.0 SDK 容器鏡像的一部分進行發(fā)布,而不再歸屬于 .NET Core 3.0 SDK。

紅帽軟件支持

2015 年 4 月,我們宣布 .NET Core 將全面登陸 Red Hat Enterprise Linux。通過與紅帽方面的出色工程合作,.NET Core 1.0 于 2016 年 6 月以組件的形式出現在紅帽系列軟件當中。另外,在與紅帽工程師們的持續(xù)交流當中,我們也了解到 Linux 社區(qū)在軟件發(fā)布方面的反饋與意見。

過去四年以來,紅帽公司先后發(fā)布了多次面向 .NET Core 的更新與大版本升級,包括 2.1 與 2.2 版本。在 .NET Core 2.2 版本當中,紅帽公司將其 .NET Core 產品擴展至包括 OpenShift 在內的多個平臺。而隨著 RHEL 8 的發(fā)布,我們也高興地看到微軟 .NET Core 2.1 以及即將推出的 3.0 版本都被納入紅帽 Application Streams 當中。

3

總結

.NET Core 3.0 是 .NET Core 發(fā)展歷程中的又一重要新版本,其中帶來了大量改進。我們建議大家盡快著手采用新的 .NET Core 3.0。新版本通過多種方式對 .NET Core 做出巨大改進,例如顯著降低了 SDK 的體積、極大提升對于關鍵場景(例如容器以及 Windows 桌面應用程序)的支持效果。受到篇幅所限,這里無法一一列出其它小的改進,但相信隨著時間的推移,大家一定能夠從這些細節(jié)增強中受益。

最后,希望大家能夠在接下來的使用當中與我們分享體驗與感受。希望開發(fā)者喜歡 .NET Core 3.0,我們也熱切希望根據大家的喜好對產品進行打磨。

https://devblogs.microsoft.com/dotnet/announcing-net-core-3-0/

責任編輯:中山網站建設
 【網訊網絡】國家高新技術企業(yè)》十年專注軟件開發(fā),網站建設,網頁設計,APP開發(fā),小程序,微信公眾號開發(fā),定制各類企業(yè)管理軟件(OA、CRM、ERP、訂單管理系統、進銷存管理軟件等)!服務熱線:0760-88610046、13924923903,http://www.maojinjia.cc

您的項目需求咨詢熱線:0760-88610046(國家高新技術企業(yè))

*請認真填寫需求,我們會在24小時內與您取得聯系。

japanese老熟女老太交,国产精品无码无套在线,在线人成视频播放午夜福利,亚洲AV永久无码区成人网站,亚洲精品无码专区在线观看,视频二区精品中文字幕,久久久久成人片免费观看蜜芽,日本熟妇人妻xxxx,亚洲欧美日韩成人一区,亚洲欧美性视频
爽爽影院在线看| 国产在线五月综合婷婷| 国产精品制服丝袜白丝| 无码视频国产精品一区二区 | 久久精品国产亚洲av麻豆小说| 国产啪视频1000部免费| 亚洲男女一区二区三区| 久久夜色精品国产噜噜麻豆| 国产亚洲精品A在线无码| 麻豆人人妻人人妻人人片AV| 人人妻久久人人澡人人爽人人精品| 亚洲精品无码永久在线观看你懂的| 久久无码高潮喷水免费看| 欧美日韩天堂在线旡码| 中文人妻无码一区二区三区| 91福利国产在线观看香蕉| 久人人爽人人爽人人片AV| 国产亚洲色婷婷久久99精品| 伊人婷婷综合在线| 无码国产精成人午夜视频一区二区| 一区二区影院| 国产av天堂亚洲国产av天堂| 亚洲aⅴ永久无码中文字幕 | 又爽又色又舒服的视频无码 | 亚洲欧洲AV综合色无码| 在线免费视频a| 亚洲综合精品成人导航| 亚洲AⅤ无码日韩AV无码网站| 99RE 久久这里只有精品6| 好紧好爽免费午夜视频| 三级黄色片在线免费观看| 亚洲AV 无码片一区二区三区| 亚洲国产成人aⅴ毛片大全| 亚洲国产精品日韩专区AV| 日日摸处处碰夜夜爽| 久久久久综合国产| 九九色综合九九色| 综合色无码| 精品国产一区二区三区无码a| 亚洲人妻av无码| 久久久久久妓女精品影院|