乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - .NET 7预览和RC1,内置MAUI、帮助.NET应用程序现代化升级
关于.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。
我真诚地希望在未来能做出更多的贡献,我很高兴看到其他的贡献者找到他们感兴趣的领域,并使整个平台对每个人来说都是更好的!