乘风破浪,遇见下一代全平台解决方案.NET 6(长期支持版,LTS) - 一统浏览器、云、桌面、IoT及移动应用
什么是.NET 6
.NET 6为浏览器(Browser
)、云(Cloud
)、桌面(Desktop
)、物联网(IOT
)和移动应用程序(Mobile Apps
)提供了一个统一的平台。底层平台已更新,以满足所有应用程序类型的需求,并使您可以轻松地在所有应用程序中重用代码。新功能和改进可同时用于所有应用程序,因此您在云中或移动设备上运行的代码具有相同的行为方式并具有相同的优势。
随着每个版本的发布,.NET开发人员的范围不断扩大。机器学习(Machine learning
)和WebAssembly是最近添加的两个。例如,通过机器学习,您可以编写应用程序来查找流数据中的异常情况。使用Web Assembly,您可以在浏览器中托管.NET应用程序,就像HTML和JavaScript一样,或者将它们与HTML和JavaScript混合。
最令人兴奋的新增功能之一是.NET多平台应用程序UI(.NET MAUI
)。您现在可以在单个项目中编写代码,从而提供跨桌面和移动操作系统的现代客户端应用程序体验。.NET MAUI将比.NET 6晚一点发布。我们在.NET MAUI上投入了大量时间和精力,很高兴能够发布它并看到.NET MAUI应用程序投入生产。
当然,.NET应用程序也在Windows桌面上(使用Windows Forms和WPF)以及在云中使用ASP.NET Core。它们是我们提供时间最长的应用程序类型,并且仍然非常受欢迎,我们在.NET 6中对它们进行了改进。
更新内容
- 通过微软自有服务、其他公司运行的云应用程序和开源项目进行了生产压力测试。
- 作为最新的长期支持(LTS)版本,支持三年。
- 跨浏览器、云、桌面、物联网和移动应用程序的统一平台,所有应用程序都使用相同的.NET库和轻松共享代码的能力。
- 性能全面提升,尤其是文件I/O,减少了执行时间、延迟和内存使用。
- C# 10提供了语言改进,例如记录结构、隐式使用和新的lambda功能,同时编译器添加了增量源生成器。
- F# 6添加了新功能,包括基于任务的异步、管道调试和众多性能改进。
- Visual Basic在Visual Studio体验和Windows Forms项目打开体验方面进行了改进。
- 热重载,使用户可以跳过重新构建和重新启动应用程序以查看新更改——在Visual Studio 2022和.NET CLI中支持,适用于C#和Visual Basic。
- 云诊断,已通过OpenTelemetry和Dotnet Monitor得到改进,现在在生产中得到支持,并且可用于Azure应用服务。
- JSON API,更强大,具有更高的性能,带有序列化程序的源生成器。
- ASP.NET Core中引入了Minimal APIs,以简化入门体验并提高HTTP服务的性能。
- Blazor组件现在可以从JavaScript呈现并与现有的基于JavaScript的应用程序集成。
- 用于Blazor WebAssembly(Wasm) 应用程序的WebAssembly AOT编译,以及对运行时重新链接和本机依赖项的支持。
- 使用ASP.NET Core构建的单页应用程序(Single-page apps) 现在使用更灵活的模式,可以与Angular、React和其他流行的前端JavaScript框架一起使用。
- 添加了HTTP/3,以便ASP.NET Core、HttpClient和gRPC都可以与HTTP/3客户端和服务器交互。
- File IO,现在支持符号链接,并通过重新编写的
FileStream
大大提高了性能。 - 通过支持OpenSSL 3、ChaCha20Poly1305加密方案和运行时深度防御缓解措施,特别是W^X和CET,安全性得到了提高。
- 可以为Linux、macOS和Windows(以前仅适用于Linux)发布单文件应用程序(免解压)。
- IL修整(IL trimming) 现在更加强大和有效,新的警告和分析器可确保正确的最终结果。
- 添加了源代码生成器和分析器(Source generators and analyzers),可帮助用户生成更好、更安全和更高性能的代码。
- 源代码构建(Source build) 使Red Hat等组织能够从源代码构建.NET,并向其用户提供自己的构建版本。
该版本包括大约一万个git提交。您必须下载并试用.NET 6才能看到所有新内容。
对云服务的意义
-
体积更小:对于微服务分布式架构而言,更小的体积意味着更少的下载带宽,更快的分发下载速度,.NET 6的镜像体积都很小,alpine的镜像更小,带上应用程序通常80M。
-
启动速度更快:对于传统单体应用,启动速度与运行效率相比不是一个关键的指标。原因是,这些应用重启和发布频率相对较低。然而对于需要快速迭代、水平扩展的微服务应用而言,更快的的启动速度就意味着更高的交付效率,和更加快速的回滚。尤其当你需要发布一个有数百个副本的应用时,缓慢的启动速度就是时间杀手。对于Serverless应用而言,端到端的冷启动速度则更为关键,即使底层容器技术可以实现百毫秒资源就绪,如果应用无法在500ms内完成启动,用户就会感知到访问延迟。
-
占用资源更少:运行时更低的资源占用,意味着更高的部署密度和更低的计算成本。.NET 6的CLR启动速度非常快,降低启动时资源消耗,可以减少资源争抢,更好保障其他应用SLA。
-
支持水平扩展:.NET 6默认更好的支持Docker资源限制,官方团队也在努力让.NET 6成为真正的容器运行时,使其在低内存环境中具有容器感知功能并高效运行。随着内存成本的下降和虚拟化的流行,大内存配比已经成为趋势。所以我们一般是采用水平扩展的方式,同时部署多个应用副本,在一个计算节点中可能运行一个应用的多个副本来提升资源利用率。
面向.NET6
继续以广泛的平台为主题,在所有这些操作系统上编写.NET代码很容易。
要以.NET 6为目标,您需要使用.NET 6目标框架,如下所示:
<TargetFramework>net6.0</TargetFramework>
这个net6.0
Target Framework Moniker(TFM)使您可以访问.NET提供的所有跨平台API。如果您正在编写控制台应用程序、ASP.NET Core应用程序或可重用的跨平台库,这是最佳选择。
如果您的目标是特定的操作系统(例如编写Windows Forms或iOS应用程序),那么还有另一组TFM(每个都针对一个不言自明的操作系统)供您使用。它们使您可以访问net6.0中的所有API以及一堆特定于操作系统的API。
net6.0-android
net6.0-ios
net6.0-maccatalyst
net6.0-tvos
net6.0-windows
每个无版本的TFM都相当于.NET 6以最低支持的操作系统版本为目标。如果您想要特定或访问更新的API,可以指定操作系统版本。
net6.0
和net6.0-windows
的TFM都是支持的(与.NET 5相同)。Android和Apple的TFM是.NET 6的新增功能,目前处于预览阶段。稍后的.NET 6更新将支持它们。
操作系统特定的TFM之间没有兼容性关系。例如,net6.0-ios
与net6.0-tvos
不兼容。如果您想共享代码,您需要使用带有#if
语句的源代码或带有net6.0
目标代码的二进制文件来实现。
C# v10
欢迎来到C# v10。C# v10的一个主要主题是继续从C# v9中的顶级语句开始的简化之旅。新功能从Program.cs
中删除了更多的仪式,导致程序只有一行。他们的灵感来自与没有C#经验的人(学生、专业开发人员和其他人)交谈,并学习对他们来说最有效且直观的方法。
大多数.NETSDK模板都已更新,以提供C# v10现在可以实现的更简单、更简洁的体验。我们听到反馈说有些人不喜欢新模板,因为它们不是为专家设计的,删除面向对象,删除在编写C#的第一天就需要学习的重要概念,或者鼓励在一个文件中编写整个程序。客观地说,这些观点都不是真的。新模型同样适用于学生和专业开发人员。然而,它与我们在.NET6之前拥有的C派生模型不同。
C# v10中还有其他一些功能和改进,包括记录结构。
全局using指令
全局using指令让您只需指定一次using
指令,并将其应用于您编译的每个文件。
以下示例显示了语法的广度:
global using System;
global using static System.Console;
global using Env = System.Environment;
您可以将global using
语句放在任何.cs
文件中,包括在Program.cs
中。
隐式using是一个MSBuild概念,它会根据SDK自动添加一组global using
指令。例如,控制台应用隐式使用不同于ASP.NETCore。
隐式使用是选择加入的,并在PropertyGroup
中启用:
<ImplicitUsings>enable</ImplicitUsings>
隐式使用是现有项目的选择加入,但默认情况下包含在新的C#项目中。有关更多信息,请参阅隐式使用。
文件范围的命名空间
文件范围的命名空间使您可以为整个文件声明命名空间,而无需将其余内容嵌套在{ ... }
中。只允许一个,并且它必须出现在声明任何类型之前。
新语法是一行:
namespace MyNamespace;
class MyClass { ... } // Not indented
这种新语法是三行缩进样式的替代:
namespace MyNamespace
{
class MyClass { ... } // Everything is indented
}
好处是在整个文件都在同一个命名空间中的极其常见的情况下减少缩进。
记录结构
C# 9引入了记录作为类的一种特殊的面向值的形式。在C# v10中,您还可以声明结构记录。C#中的结构已经具有值相等性,但记录结构添加了==
运算符和IEquatable<T>
的实现,以及基于值的ToString
实现:
public record struct Person
{
public string FirstName { get; init; }
public string LastName { get; init; }
}
就像记录类一样,记录结构可以是“位置”的,这意味着它们有一个主构造函数,它隐式声明了与参数对应的公共成员:
public record struct Person(string FirstName, string LastName);
但是,与记录类不同,隐式公共成员是可变的自动实现的属性。这是因为记录结构是元组的自然成长故事。例如,如果您有一个(string FirstName, string LastName)
返回类型,并且您希望将其扩展为命名类型,则可以轻松声明相应的位置结构记录并维护可变语义。
如果您想要一个具有只读属性的不可变记录,您可以将整个记录结构声明为只读(就像其他结构一样):
public readonly record struct Person(string FirstName, string LastName);
C# v10还支持表达式,不仅适用于记录结构,还适用于所有结构以及匿名类型:
var updatedPerson = person with { FirstName = "Mary" };
热重载
热重载是另一个性能特性,专注于开发人员的生产力。它使您能够对正在运行的应用程序进行各种代码编辑,从而减少您等待应用程序重新构建、重新启动或重新导航到进行代码更改后所在位置所需的时间。
热重载可通过dotnet watch CLI
工具和Visual Studio 2022
使用。您可以将热重载用于多种应用程序类型,例如ASP.NETCore、Blazor、.NET MAUI、控制台、Windows窗体(WinForms)、WPF、WinUI3、Azure Functions等。
使用CLI时,只需使用dotnet watch
启动您的.NET 6应用程序,进行任何支持的编辑,并在保存文件时(如在Visual Studio Code中)将立即应用这些更改。如果不支持更改,详细信息将记录到命令窗口。
CLI体验热重载
此图像显示正在使用dotnet watch
启动的MVC应用程序。我对.cs
和.cshtml
文件(如日志中所报告的)进行了编辑,并且都应用到了代码中,并在不到半秒的时间内很快地反映在浏览器中。
使用Visual Studio 2022时,只需启动您的应用程序,进行受支持的更改,然后使用新的“热重载”按钮(如下图所示)应用这些更改。您还可以选择通过同一按钮上的下拉菜单在保存时应用更改。使用Visual Studio 2022时,热重载可用于多个.NET版本、.NET5+、.NETCore和.NET Framework。例如,您将能够对按钮的OnClickEvent
处理程序进行代码隐藏更改。应用程序的Main
方法不支持它。
Visual Studio 2022体验热重载
注意:RuntimeInformation.FrameworkDescription
中存在一个错误,该错误在该图像中显示,将很快修复。
热重载还与现有的“编辑并继续”功能(在断点处停止时)和XAML热重载协同工作,用于实时编辑应用程序UI。目前支持C#和Visual Basic应用程序(不是F#)。
Windows Forms
我们继续对Windows Forms进行关键改进。.NET 6包括更好的控件可访问性、设置应用程序范围默认字体的能力、模板更新等。
辅助功能改进
在此版本中,我们为CheckedListBox
、LinkLabel
、Panel
、ScrollBar
、TabControl
和TrackBar
添加了UIA提供程序,这些提供程序使讲述人等工具和测试自动化能够与应用程序的元素进行交互。
默认字体
您现在可以使用Application.SetDefaultFont
为应用程序设置默认字体。
void Application.SetDefaultFont(Font font)
最小的应用
以下是使用.NET6的最小Windows Forms应用程序:
class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
作为.NET 6版本的一部分,我们一直在更新大多数模板,使其更加现代和简约,包括Windows Forms。我们决定让Windows Forms模板更传统一些,部分原因是需要将[STAThread]
属性应用于应用程序入口点。然而,除了立即出现之外,还有更多的玩法。
ApplicationConfiguration.Initialize()
是一个源代码生成的API,它在幕后发出以下调用:
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetDefaultFont(new Font(...));
Application.SetHighDpiMode(HighDpiMode.SystemAware);
这些调用的参数可通过csproj
或props
文件中的MSBuild属性进行配置。
Visual Studio 2022中的Windows Forms设计器也知道这些属性(目前它只读取默认字体),并且可以向您显示您的应用程序,就像它在运行时一样:
模板更新
C#的Windows Forms模板已更新,以支持新的应用程序引导程序、全局using指令、文件范围的命名空间和可为空的引用类型。
更多运行时设计器
现在您可以构建通用设计器(例如,报表设计器),因为.NET6具有设计器和设计器相关基础结构的所有缺失部分。有关更多信息,请参阅此博客文章。
.NET 6中的中断性变更
https://docs.microsoft.com/zh-cn/dotnet/core/compatibility/6.0
.NET运行环境检查工具
安装.NET运行环境检查工具
dotnet tool install --global dotnet-runtimeinfo
使用.NET运行环境检查工具
dotnet runtimeinfo
安装.NET MAUI(Visual Studio 2022 Preview)
现在要安装.NET MAUI,您需要确保使用的是今天与稳定版17.0一起发布的Visual Studio 2022(17.1)预览版。安装时,您只需要“使用.NET进行移动开发”工作负载,该工作负载默认提供“.NET MAUI(预览版)”依赖项。在未来的版本中,.NET MAUI将被提升为它自己的顶级工作负载。
就是这样!不再需要额外的扩展,您就可以开始使用.NET MAUI进行开发了。
控件和功能的更新
此版本中的新增功能是CollectionView
和IndicatorView
的处理程序实现。其他控件也看到了为VerticalTextAlignment
、TextTransform
等实现的属性。有关更改和改进的完整列表,请参阅发行说明。
CollectionView
涵盖了大多数与ListView
相同的基于虚拟化列表的场景,并添加了对其他布局(例如水平和网格)的支持。这是一个跨越两列的垂直滚动网格:
<CollectionView ItemsSource="{Binding Monkeys}"
ItemsLayout="VerticalGrid, 2">
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10" RowDefinitions="60" ColumnDefinitions="70,*">
<Image Grid.RowSpan="2"
Source="{Binding ImageUrl}"
Aspect="AspectFill"
HeightRequest="60"
WidthRequest="60">
<Image.Clip>
<RectangleGeometry Rect="0,0,160,160"/>
</Image.Clip>
</Image>
<Label Grid.Column="1"
Text="{Binding Name}"
FontAttributes="Bold"
TextColor="White"
VerticalOptions="Start"
LineBreakMode="TailTruncation" />
<Label Grid.Column="1"
Text="{Binding Location}"
LineBreakMode="TailTruncation"
FontAttributes="Italic"
TextColor="White"
VerticalOptions="End" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
改进控件的使用说明文档
.NET技术社区论坛
.NET是一个统一平台,使开发人员能够跨操作系统和平台构建世界一流的应用程序。有数百万开发人员使用.NET构建应用程序并帮助其他开发人员开始使用.NET的全球社区。去年,在讨论和获得技术帮助方面,我们开始了统一.NET社区的旅程。首先,我们推出了Microsoft Q&A for .NET,这是一个提供.NET技术问题和答案的主页。该中心的访客、问题和来自社区和Microsoft员工的回答数量逐月大幅增长。我们要感谢大家如此参与问答,这导致每个月有超过80%的问题得到解答!
馈,需要一个空间来进行问答之外的更多互动。您告诉我们,您正在寻找一个专门的论坛,在那里您可以进行技术讨论、讨论最佳实践、讨论新版本并分享操作指南。这就是为什么我们很高兴地宣布所有.NET开发人员主题和讨论的.NET技术社区论坛!
技术社区功能
无论您是Web开发人员、移动和桌面开发人员、微服务、数据、机器学习还是刚入门,都有适合您的讨论空间!只需加入.NET技术社区,选择一个讨论空间,开始新的讨论,并与其他.NET开发人员协作!
关注话题
可以关注.NET技术社区上的每个主题,因此您可以通过电子邮件、RSS源或在您的技术社区主页上获取更新。
加入更多社区
.NET技术社区最好的部分是它是整个Microsoft技术社区的一部分。您可以加入、关注和开始讨论大量产品和专题社区中心。
建立您的个人资料并获得成就
谁不喜欢通过帮助社区和讨论您最喜欢的话题来获得成就和荣誉!
新的.NET技术社区将与Microsoft问答并存:
- 适用于.NET的Microsoft问答–为您提供技术问题和支持
- .NET技术社区-用于技术讨论、操作方法等。
技术社区和问答的推出有助于与Microsoft面向开发人员的所有产品保持一致,包括Azure、Teams、Office以及您将在这两个平台上找到的更多产品。
参考
- Announcing .NET 6 — The Fastest .NET Yet
- .NET 6 预览版发布,Python的跨平台地位受到挑战
- .NET 生态系统的蜕变之 .NET 6云原生
- 微软认真聆听了开源 .NET 开发社区的炮轰: 通过CLI 支持 Hot Reload 功能
- 微软 .NET 6 正式发布:C# 10、F# 6、PowerShell 7.2 推出,支持三年
- .NET 6 Release Candidate 1 Ships
- Announcing .NET MAUI Preview 10
- .NET November 2021 Updates – 5.0.12 and 3.1.21
- What’s New for Visual Basic in Visual Studio 2022
- Welcome to C# 10
- Announcing .NET 6 Preview 7
- Announcing ASP.NET Core in .NET 6
- Introducing the .NET Tech Community Forums
- 浅讲.Net 6 并与之前版本写法对比