.NET7.0剛釋出不久,.NET社群開始了.NET8.0的開發,重心重新回到了新功能的迭代。
我們知道在.NET7.0中一個令人激動的特新就是支援了NativeAOT,我們可以通過NativeAOT生成本機程式,由於無需JIT編譯,所以無需安裝.NET Runtime,也進一步的提升了.程式的啟動速度,降低了程式的體積,在使用者端軟體開發、ServerLess等場景會有不錯的前景。關於NativeAOT釋出的詳情可以點下方連結:
https://learn.microsoft.com/zh-cn/dotnet/core/deploying/native-aot/
作為地表最強的.NET WEB伺服器ASP.NET Core,自然也是支援NativeAOT編譯,而今天就是為大家介紹關於.NET8.0中ASP.NET Core中計劃的一些NativeAOT改進。
.NET 7引入了對將.NET控制檯專案作為本地AOT釋出的支援,產生了一個獨立的、針對平臺的可執行檔案,沒有任何執行時JIT。本地AOT應用程式啟動非常快,而且使用的記憶體更少。該應用程式可以被部署到沒有安裝任何.NET執行時的機器或容器中。在.NET 8中,我們將把對本地AOT的支援擴充套件到ASP.NET Core,首先是以云為重點,用最小的API構建的API應用程式,滿足關於釋出檔案大小、啟動時間、工作集和吞吐效能的期望。
如前所述,.NET8.0的主要重點是使用Minimal APIs實現ASP.NET Core API應用程式的本地AOT釋出。這裡的 "支援本地AOT"是指確保專案能夠通過<PublishAOT>
專案屬性啟用本地AOT釋出,並且由此產生的開發經驗能夠引導開發人員製作本地AOT釋出的應用程式,而不會出現構建、釋出或執行時警告和錯誤。這意味著ASP.NET Core和.NET的大多數基礎功能領域都需要更新,以支援本地AOT,包括:
此外,作為一個次要目標,我們將在實現以下功能領域的NativeAOT釋出方面取得進展:
以下功能領域暫時不在NativeAOT支援的範圍內:
本地AOT有一些限制,這意味著在釋出本地AOT時不支援.NET中的某些API和程式碼模式。這些包括依賴執行時JIT的功能,如動態程式碼生成和編譯、組合載入等,以及導致程式碼被本地AOT編譯過程修剪掉的模式,這些都是執行應用程式所需要的,導致執行時失敗。
在為ASP.NET Core增加對本地AOT的支援時,我們必須確保開發體驗是這樣的:開發人員可以合理地確定他們的應用程式在釋出為本地AOT後將如何執行。如果當前的API和功能的設計方式與原生AOT不相容,我們將利用包括原始碼生成器、分析器和程式碼修復器在內的工具,讓現有的API與NativeAOT協同工作,或者讓開發者以合理的方式更新他們的應用程式與NativeAOT協同工作。
這項工作的第一階段是使用新的專案模板建立ASP.NET Core API專案,啟用本地AOT,可以在沒有任何警告或錯誤的情況下構建、釋出和執行,並且滿足可執行檔案大小、啟動時間、工作集和吞吐量的定義指標。
這些指標主要以Linux為重點,因為它是主要的部署目標,但Windows和macOS上的大小仍將被跟蹤,並與這些目標保持一致,因為在候選平臺調查期間,它往往有助於感知。
這裡的 "預設"是指與基於CoreCLR的應用程式部署的預設設定相比,例如包括分層JIT。
第二階段建立在第一階段的基礎上,使更多的"真實世界"的ASP.NET Core API應用程式成為本地AOT釋出。這些應用程式將使用更多通常與在雲環境中執行API應用程式有關的功能,包括AuthN/Z、資料存取、OpenTelemetry等。TrimmedTodo API應用程式將作為這種應用程式的最初例子。
這些主要是以Linux為重點,因為這是主要的部署目標,但在Windows和macOS上的大小仍將被跟蹤,並與這些目標保持一致,因為它往往有助於在候選平臺調查中的感知。
我們從.NET社群最新的計劃可以看出,ASP.NET Core將繼續在雲原生場景發力,通過支援NativeAOT來降低可執行檔案大小、縮短啟動時間降低記憶體佔用,筆者本人是非常期待這樣的更新,在之前筆者的文章AOT和單檔案發布對程式效能的影響中測試了.NET6.0時代ASP.NET Core AOT的的一些資料,後面.NET8.0釋出以後期待它的改進。
以下是.NET6.0 ASP.NET Core AOT的資料:
Github對應連結:https://github.com/dotnet/aspnetcore/issues/45910