關於.NET 7.0
首個預覽版已發布,.NET 7有什么新東西?
隨着第一個預覽版發布,.NET 7漸漸浮出水面,.NET高級項目經理Jeremy Likness在官方博客中介紹了.NET 7的主要發展方向,俺整理給大伙做一下介紹:
.NET 7建立在.NET 6建立的基礎之上,其中包括一組統一的基礎庫、運行時(runtime)和SDK、簡化的開發體驗和更高的開發人員生產力,.NET 7主要關注領域包括:
- 改進對雲原生方案的支持
- 升級舊項目的工具
- 簡化開發人員使用容器的難度
現代客戶端:.NET多平台應用程序UI(.NET MAUI)
.NET MAUI是.NET跨平台原生UI的未來,將成為.NET 7的一部分。
2月15日.NET MAUI Preview 13發布,在.NET MAUI GA為.NET 6發布后,它將會被包含在.NET 7中,並持續改進開發循環體驗、支持最新的.NET SDK工具、更快的應用程序性能、共享代碼功能以及增強的互操作性。
感興趣的兄弟可查看.NET MAUI的狀態和項目路線圖,以獲取更多信息。
現代雲:雲原生和容器
.NET 7將改進開發人員體驗:每個人都能更輕松地構建雲原生應用程序,例如:
- 簡化安全身份驗證和授權所需的設置和配置
- 提高雲原生應用程序啟動和運行時的執行性能
於此同時,.NET 7將持續投資雲原生配套的工具,比如投資.NET跨平台框架Orleans——一個構建分布式應用程序的跨平台框架。具體投資措施有:繼續增強Orleans的綜合文檔,並通過改進Orleans與Azure App Services和Azure Container Apps等現有雲服務的集成,使其更易於使用和實施。
此外,.NET 7計划使用容器對.NET開發進行重大改進。例如:
- 探索將“通過MSBuild直接構建容器”作為SDK的一項新功能
- 計划增強遙測,以提高容器的可觀察性
- 專注於使容器鏡像更小、更快、更安全,同時探索高要求的模型
現代化:升級.NET應用程序
.NET.NET 7繼續致力於讓開發者將現有的.NET應用程序升級到最新的.NET平台和技術。
https://dotnet.microsoft.com/zh-cn/platform/upgrade-assistant
dotnet tool install -g upgrade-assistant
.NET升級助手(.NET Upgrade Assistant)包含更多分析器、代碼修復程序,以及對更多應用程序類型的升級支持,可幫助開發者更輕松地升級.NET應用程序組合,減少升級應用的工作量。
此外,.NET已有20年歷史,它的應用程序非常多,其中一些熱門應用比如ASP.NET、WinForms、WPF等,由於文檔和教程較豐富,現代化的速度比較快,用戶升級起來也輕松。但其中一些較冷門的項目,例如WCF(Windows Communication Foundation,微軟開發的一系列支持數據通信的應用程序框架),可能沒有明確的現代化方向,.NET將對這部分冷門應用提供適當的指導、文檔和工具,以使這些.NET應用程序模型更易於升級。
面向.NET 7
如果現在就要面向.NET 7,則需要在項目文件中使用 .NET 7 Target Framework Moniker(TFM)。例如:
<TargetFramework>net7.0</TargetFramework>
附全套.NET 7TFM,包括特定操作系統的TFM。
net7.0
net7.0-android
net7.0-ios
net7.0-maccatalyst
net7.0-macos
net7.0-tvos
net7.0-windows
如此便可以使用.NET 7測試現有的應用程序,目前來看,從.NET 6升級到.NET 7還是比較輕松的。
2022年2月17日,公布.NET 7預覽版1
今天,我們很高興地宣布了.NET歷史上的下一個里程碑。在慶祝社區和20年創新的同時,.NET 7 Preview 1標志着向.NET的下一個20年邁出了第一步。
ASP.NET Core Preview 1和EF7 Preview 1也在今天發布。
.NET 7建立在.NET 6建立的基礎上,其中包括一套統一的基礎庫、運行時和SDK,簡化的開發體驗,以及更高的開發人員生產力。.NET 7的主要關注領域包括改進對雲端原生場景的支持、使之更容易升級傳統項目的工具,以及通過使之更容易使用容器來簡化開發者的體驗。
.NET 7預覽版1包括對API的注釋,以支持nullability,持續的JIT編譯器優化,新的API,以及對更多熱重載場景的支持。
.NET的發布包括產品、庫、運行時和工具,並代表了微軟內部和外部多個團隊的合作。這篇博文所涉及的更廣泛的主題並不包括.NET 7的所有關鍵方案和投資。它們代表了很大的領域,但只是進入.NET 7的所有重要工作的一部分。我們計划在ASP.NET Core、Blazor、EF Core、WinForms、WPF和其他平台上進行廣泛投資。你可以通過閱讀產品路線圖了解這些領域的更多信息。
你可以下載.NET 7預覽版1,用於Windows、macOS和Linux。
- Installers and binaries
- Container images
- Linux packages
- Release notes
- Known issues
- GitHub issue tracker
.NET 7已經用Visual Studio 17.2 Preview 1進行了測試。 如果你想用Visual Studio家族產品嘗試.NET 7,我們建議你使用預覽通道構建。Visual Studio for Mac對.NET 7預覽版的支持還沒有提供,但很快就會推出。
現代客戶端(Modern client):.NET多平台應用程序用戶界面(.NET MAUI)
.NET MAUI是使用.NET的跨平台原生UI的未來,將成為.NET 7的一部分。周二,我們發布了.NET MAUI預覽版13。我們目前正專注於為.NET 6提供.NET MAUI支持,我們預計很快就會發布候選版本(RC)。在我們有了RC之后,我們將專注於運送更多的RC,直到我們達到普遍可用(GA)所需的質量。在.NET MAUI GA為.NET 6發布后,我們將把它納入.NET 7,並着眼於改善內部開發循環體驗,支持最新的.NET SDK工具,更快的應用性能,共享更多的代碼,以及增強的互操作故事。
現代雲(Modern cloud):雲原生(Modern cloud)和容器(containers)
雲原生應用程序從頭開始構建,以利用現代的、基於網絡的資源,如數據庫服務和托管容器。雲原生架構可以通過創建自主的子系統(通常被稱為微服務)來提高大型應用的規模,這些子系統的部署和擴展獨立於應用的其他區域,同時從長遠來看降低了成本。微服務架構是一種流行的方法,因為它很靈活,旨在發展和擴展到單體架構中難以實現的極限。
.NET 7將通過探索對開發者體驗的改進,使構建雲原生應用程序變得更加容易,例如。
- 簡化實施安全認證和授權所需的設置和配置
- 提高應用程序的啟動和運行時執行的性能。
我們將繼續對Orleans進行投資,這是一個用於構建分布式應用的.NET跨平台框架,被稱為 "分布式.NET"。我們將繼續加強Orleans的全面文檔,並通過改善Orleans與現有雲服務(如Azure App Services和Azure Container Apps)的整合,使其更易於使用和實施。
容器是目前許多公司部署雲原生應用和微服務的首選方式。依靠容器帶來了一些挑戰,包括管理合規性、構建和發布鏡像、保障鏡像安全以及簡化鏡像的大小和性能。我們相信,有機會利用.NET容器創造更好的體驗。
為了幫助客戶面對這些挑戰,我們計划在.NET 7中用容器對.NET開發進行重大改進。例如,我們將探索通過MSBuild直接構建容器,作為SDK的一項新功能。我們計划加強遙測,以提高容器的可觀察性。我們還將專注於使我們的容器鏡像更小、更快、更安全,同時我們將探索高度要求的模式,如無根(rootless)和無發行版(distroless)。
現代化(Modernize):升級.NET應用程序
自.NET 6發布以來,開發人員一直在升級他們的應用程序,以利用新的性能提升、最小化API和熱重載等生產力特性、新的運行時和C#語言創新以及成熟的庫和工具生態系統的可用性。
https://dotnet.microsoft.com/zh-cn/platform/upgrade-assistant
在.NET 7中,我們將繼續使您能夠將您現有的.NET應用推進到最新的.NET平台和技術。更多的分析器、代碼修復器以及對 .NET升級助手(.NET Upgrade Assistant)中更多應用類型的支持,將幫助您自信地升級更多的應用組合,並在升級所涉及的重復性任務中花費更少的時間。
我們也知道,每一種.NET應用模型(ASP.NET、WinForms、WPF等)在現代化方面都有自己獨特的挑戰,而且可能缺乏你作為開發者所需要的功能,或者缺乏平台本身的支持。對於其中的一些,如WCF,可能沒有一個明確的方向給你。我們將專注於提供適當的指導、文檔和工具,使這些.NET應用模型更容易升級。
Microsoft.Extensions的可空屬性注解
我們在對Microsoft.Extensions.*
庫進行可忽略性注釋方面一直在取得進展。在.NET 7 Preview 1中,以下庫已被注釋為可忽略的。
- Microsoft.Extensions.DependencyInjection.Abstractions
- Microsoft.Extensions.Logging.Abstractions
- Microsoft.Extensions.Primitives
- Microsoft.Extensions.FileSystemGlobbing
- Microsoft.Extensions.DependencyModel
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.FileProviders.Abstractions
- Microsoft.Extensions.FileProviders.Physical
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Binder
- Microsoft.Extensions.Configuration.CommandLine
- Microsoft.Extensions.Configuration.EnvironmentVariables
- Microsoft.Extensions.Configuration.FileExtensions
- Microsoft.Extensions.Configuration.Ini
- Microsoft.Extensions.Configuration.Json
到.NET 7發布時,我們計划對所有的Microsoft.Extensions.*
庫進行注解,以實現其無效性。你可以在dotnet/runtime#43605
查看剩余的庫,並關注進展情況。
非常感謝@maxkoshevoi,他貢獻了大部分的努力。沒有@maxkoshevoi的幫助,我們就不會走到今天。
互操作:p/Invoke代碼生成
我們將.NET 6中原型化的p/invoke源生成器集成到dotnet/runtime 中,並一直在轉換運行時庫以使用它。這意味着轉換后的p/調用與AOT兼容,不再需要在運行時生成IL存根
我們打算使p/invoke源生成器將來在運行時之外可用。您可以在dotnet/runtime#60595中關注我們的剩余工作.
System.Text.Json中的新API
System.Text.Json附帶了一些小的質量增強功能:
- 開發人員現在可以訪問
System.Text.Json
內部使用的默認單例(相關問題).JsonSerializerOptions
- 添加一個屬性,並確保此值在序列化時從等效屬性流出(相關問題)
.JsonWriterOptions.MaxDepthJsonSerializerOptions.MaxDepth
- 將方法添加到(相關問題)
.PatchSystem.Net.Http.Json
熱重載(Hot reload)改進
現在允許在Blazor WebAssembly的C#熱重載和適用於iOS和Android的.NET中進行以下編輯(相關問題):
- 將靜態lambda添加到現有方法
- 將捕獲此值的lambda添加到已具有至少一個捕獲此值的lambda的現有方法中
- 向現有類添加新的靜態或非虛擬實例方法
- 向現有類添加新的靜態字段
- 添加新類
已知問題:
- 不支持新添加類中的實例字段
- 現有類或新類中新添加的方法和字段對反射不可見
您可以在dotnet/runtime#57365中關注我們的進度
以.NET 7為目標
若要以.NET 7為目標,需要在項目文件中使用.NET 7目標框架名稱(TFM)。例如
<TargetFramework>net7.0</TargetFramework>
下面是全套.NET 7 TFM,包括特定於操作的TFM。
- net7.0
- net7.0-android
- net7.0-ios
- net7.0-maccatalyst
- net7.0-macos
- net7.0-tvos
- net7.0-windows
我們預計從.NET 6升級到.NET 7應該很簡單。請報告在使用.NET 7測試現有應用的過程中發現的任何重大更改。
宣布.NET 7候選發布版本1
今天我們宣布.NET 7候選發布版1。這是在生產中支持的.NET 7的兩個候選發布版(RC)中的第一個。
你可以下載.NET 7候選發布版1,用於Windows、macOS和Linux。
.NET 7候選發布版本1已經用Visual Studio 17.4 Preview 2進行了測試。如果你想用Visual Studio家族產品嘗試.NET 7,我們建議你使用預覽通道構建。如果你是在macOS上,我們建議使用最新的Visual Studio 2022 for Mac預覽版。
不要忘記.NET Conf 2022。加入我們吧,2022年11月8日至10日,慶祝.NET 7的發布!
在這篇博客中,我們將強調.NET 7的核心主題,並為您提供深入了解這些細節的資源。
要想更詳細地回顧.NET 7候選發布版中包含的所有功能和改進,請查看之前的.NET 7預覽版博文。
- Announcing .NET 7 Preview 1
- Announcing .NET 7 Preview 2
- Announcing .NET 7 Preview 3
- Announcing .NET 7 Preview 4
- Announcing .NET 7 Preview 5
- Announcing .NET 7 Preview 6
- Announcing .NET 7 Preview 7
.NET MAUI
.NET多平台應用程序用戶界面(MAUI)將Android、iOS、macOS和Windows的API統一為一個API,因此您可以編寫一個應用程序,在許多平台上原生運行。.NET MAUI使你能夠提供每個平台(Android、iOS、macOS、Windows和Tizen)專門設計的最佳應用體驗,同時使你能夠通過豐富的風格和圖形來制作一致的品牌體驗。開箱即用,每個平台的外觀和行為都是它應該有的,不需要任何額外的小部件或造型。
作為.NET 7的一部分,.NET MAUI提供了一個單一的項目,處理跨設備及其平台的多目標。要了解更多關於生產力改進、工具和性能增強的信息,請查看這些資源。
注意:在即將發布的17.4預覽版2.1中,將提供用.NET 7嘗試.NET MAUI的Visual Studio體驗。
雲原生(Cloud Native)
雲原生是一套最佳實踐,用於在雲中構建你的應用程序,以利用彈性、可擴展性、效率和速度的優勢。
.NET是構建雲原生應用程序的最佳選擇。要了解更多關於.NET 7中的雲原生功能和改進,請查看這些資源。
ARM64
ARM提供了一個小的外形尺寸,具有卓越的性能和高功率效率。
.NET可以幫助您構建在ARM設備上運行的應用程序。有關.NET 7在ARM64上運行速度的更多信息,請查看這些資源。
現代化(Modernization)
在現代版本的.NET上,你可以利用快如閃電的性能和大量的新功能來提高你的開發人員的生活質量。
為了使升級體驗盡可能無縫,.NET升級助手為您提供了一個指導性的逐步體驗,通過分析和升級您的項目文件、代碼文件和依賴關系,使您的.NET應用程序現代化。
欲了解更多有關.NET 7如何幫助您實現應用程序現代化的信息,請查看這些資源。
性能
.NET是快速的。.NET 7是迄今為止最快的.NET。在.NET 7中,有超過一千項影響性能的改進,包括反射、堆棧替換(OSR)、啟動時間、本地AOT、循環優化和許多其他領域。
關於為什么.NET 7是目前最快的版本的更多信息,請查看這些資源。
貢獻者聚光燈 - 菲利普-納瓦拉
向我們所有的社區成員表示巨大的 "感謝"。我們深深感謝你的深思熟慮的貢獻。我們請貢獻者@filipnavara分享他的想法。
用菲利普自己的話說。
我從小就開始玩電腦。在看望爺爺的時候,我經常看到他用BASIC做工作。他在寫工廠自動化軟件,我從他那里繼承了我對所有技術事物的熱愛。DOS是當時的標准系統,Borland主導了編程工具。我想了解編程是如何工作的,並想學習它。我固執地拒絕了他的所有建議,不得不自己通過試驗和錯誤來學習一切。這是很愚蠢的,但看到小程序變成現實是很有趣的。
漸漸地,我開始用不同的語言編程,探索互聯網,然后是開放源代碼的世界。我主要喜歡在低級別的軟件上編碼,如編譯器、操作系統或系統模擬器。在高中期間的業余時間,我為Wine、ReactOS、QEMU、Binutils和MinGW編譯器工具集等項目做出了貢獻。
當第一個版本的.NET框架出現時,我立即被吸引住了。它保證了我所熟悉的Delphi的簡單性,而且C#語言的學習真的很有趣。這個時機非常好,因為我和我的朋友們一起開始了一個開發電子郵件客戶端應用程序的小項目,我們都同意用.NET構建它。那個應用程序,即eM客戶端,使我在整個大學學習期間一直忙於工作。時至今日,它仍然是我目前的項目;盡管團隊已經壯大,我的職責也發生了轉變,我們有很多非常有才華的程序員來減輕我的職責。
.NET的開源對我們來說是一個很大的福音,使許多事情變得更容易。現在,我可以把更多的精力放在副業上,而為.NET做貢獻是一個自然的選擇。它允許我充分運用我的知識,從硬件的低級細節,操作系統的內部結構,到我們的電子郵件應用程序所建立的高級框架。
開放的代碼使我能夠推動一個項目,將WinForms框架移植到macOS上(基於Mono代碼,但在很多地方使用Cocoa本地控件)。當.NET 5的統一計划開始進行時,我開始貢獻更多。對我們來說,像Xamarin.Mac和Mono這樣的不同平台在支持的功能上落后於我們在Windows上使用的.NET,這一直是一個痛點。最初,我開始填補Mono基礎類庫中的空白,它已經與.NET核心共享了一些代碼。我意識到這種追趕的游戲可能不是最好的解決方案,所以我開始探索其他選擇,比如在CoreCLR上運行Xamarin.Mac。這恰好發生在第一個MonoVM(.NET 5+中的Mono運行時)提交的前幾天。一旦我意識到發生了什么,我就加入了這個計划。所有這些工作都是在GitHub上公開進行的,幾個月后在Build大會上正式宣布。看到這些進展,建立我自己的Xamarin運行時,在這個早期統一的MonoVM運行時上運行,顯示出第一個用戶界面,這真是令人激動。最終,它甚至開始了我們的電子郵件客戶端應用。這對我們來說確實是一個游戲規則的改變。在舊的.NET框架下,我們無法在新功能發布時使用它們。過了幾年,新版本的部署才跟上。現在,我的情況正好相反,我比其他人更早地運行尖端的比特。
這項關於運行時統一的工作現在已經成功結束,我們向客戶發布了帶有最新的.NET 6比特的應用程序。然而,.NET中的許多地方仍然可以改進,我喜歡和.NET團隊的人一起工作。我試圖在每個版本中至少推動一個小功能。對於.NET 6,我專注於讓iOS的密碼學堆棧工作。對於.NET 7,在網絡團隊的大力幫助下,我嘗試了一個用於處理Negotiate/Kerberos/NTLM認證的小眾API。雖然這不是一個非常有吸引力或可見的功能,但它是長期的技術債務。代碼缺乏單元和功能測試;ASP.NET通過反射訪問內部,這對NativeAOT不友好;最重要的是,庫作者不得不使用復雜的方法來繞過缺乏簡單的公共API。
我真誠地希望在未來能做出更多的貢獻,我很高興看到其他的貢獻者找到他們感興趣的領域,並使整個平台對每個人來說都是更好的!