.NET 6 Preview 2 发布

前言

在 2021 年 3 月 11 日, .NET 6 Preview 2 发布,这次的改进主要涉及到 MAUI、新的基础库和运行时、JIT 改进。

.NET 6 正式版将会在 2021 年 11 月发布,支持 Windows、macOS、Linux、Android 和 iOS 等系统以及 x86、x86_64、ARM 和 ARM64 架构。另外,.NET 6 是 LTS 版本,将提供长达至少三年的支持。

那么一起来看看都有哪些内容吧。

主题:改进内部循环性能

过去的几个 .NET 版本针对提升吞吐量、减少内存消耗等性能方面做了很多工作。而在 .NET 6 将会针对内部循环性能做出改进:不仅仅追求在应用和服务上做到最佳的性能,还要追求在应用模型、工具链和工作流程上的最佳性能。

其中一些工作看起来与过去的传统吞吐量优化工作非常相似,但实际上这里不关注稳态性能,而是关注运行时、应用模型、命令行、msbuild 等的启动性能,以及工具的端到端性能(特别是对于较小的解决方案)。

这种优化所涉及的思维方式通常与针对稳态吞吐量进行优化时所使用的思维方式大不相同。对于稳态工作,您可能会专注于缓存将来可以重用的值,但是对于启动性能而言,通常您将注意力集中在只能被调用一次的操作上,而第一次调用的成本很重要。

但是,这里涉及的工作确实与许多其他性能工作一样,都有一个典型的测量-分析-修复循环:分析要优化的应用程序的相关区域,分析结果数据以查找最主要的原因和瓶颈,然后为它们提出解决方案,然后重新开始寻找下一个有影响力的项目的过程。

我们仍然处于 .NET 6 开发周期的初期,但是我们已经成功地削减了开发人员内部循环所涉及的关键领域的开销,重点关注各种 dotnet 命令,例如 newbuildrun

目前已包含的改进例如:

当然,最佳性能优化之一是避免完成全部的工作,这是 .NET 6 主题另一半的重点:.NET 热重载。通过允许在运行应用程序时甚至在未连接调试器的情况下对代码进行编辑,热重载将在所有受支持的操作系统和硬件平台上提高开发人员的生产率。开发人员修改代码后不需要重新编译和启动程序,更改将立即生效,如此可以跳过整个更改-构建-运行周期。此特性有望从根本上改善 .NET 开发人员编写应用和服务的方式。

.NET 6 编译速度改进

上图展示了 .NET 5 和 .NET 6 Preview 2 的 razor 编译时间对比。

主题:.NET 拥有优秀的客户端开发体验

.NET 6 最令人兴奋的部分之一是移动开发,目前作为单独的Xamarin 产品提供。随着时间的流逝,我们一直在使 Xamarin 更类似于主线 .NET。现在是时候为 .NET 提供完全统一的移动产品了。使用 .NET 6,iOS,Android 和 macOS 开发将集成到 .NET SDK 中,并使用 .NET 库。在过去的两年中,我们一直在努力将 Mono 集成到 .NET 中,因此开发人员可以利用这两种运行时的优势,而不必针对不同的 .NET 版本,也不必担心兼容性问题。在 .NET 5 中,我们将 Blazor WebAssembly 移了过来,并在 Xamarin 中使用了相同的模型。.NET 6 是这种统一努力的最高潮,涵盖了主题的关键部分:Xamarin 开发人员可以升级到现有应用程序并使用最新的 .NET SDK。

现在,您所有的 .NET 应用程序都将在相同的库上运行,我们希望增加在 PC 和移动平台上共享的代码量。Xamarin 的跨平台 UI 框架 Xamarin.Forms 正在演变为 .NET MAUI,使您可以使用相同的代码库轻松编写适用于 iOS,Android,Windows 和 macOS 的应用程序。.NET MAUI 作为 .NET 6 的一部分提供,同时还进行了一系列性能和工具改进,例如 .NET/C# 热重载、在跨不同平台共享更多的资源和代码,以及具有一组更灵活的 UI 控件的更好的页面呈现性能。

.NET MAUI 不仅适用于客户端应用程序开发人员。得益于重构的控件集以及可以在 .NET 6 库上运行的功能,您现有的 Blazor 应用程序可以通过 .NET MAUI 在 Windows 和 macOS 上原生运行。您将能够与 Blazor 代码库无缝结合原生控件和功能,包括特定于平台的功能。

此主题的最后一部分是关于打包,部署和发布您的跨平台客户端应用程序。由于开发应用程序的开发人员/目标平台/方式太多,因此每天结束时您必须分发许多不同的应用程序包。尤其是对于 Blazor 桌面,我们希望使体验尽可能无缝。我们正在研究改善本地和云中发行和版本控制的策略。

总结一下,在 .NET 6,你将能够:

  • 用 .NET 库构建 iOS、Android 和 macOS 应用
  • 借助 .NET MAUI 使用相同的代码创建 iOS、Android、Windows 和 macOS 客户端应用
  • 在不同平台之间共享代码和资源
  • 在 macOS 和 Windows 上原生运行 Blazor 应用
  • 轻松打包和分发你的程序

MAUI 的 GitHub 仓库:http://github.com/dotnet/maui

MAUI 更新

MAUI 的示例程序已经针对 .NET 6 Preview 2 更新:https://github.com/dotnet/net6-mobile-samples ,你可以直接使用 dotnet 的命令行构建和启动应用。

Mac Catalyst

现在可以添加如下代码到项目属性中构建 macOS 的桌面应用:

<TargetFrameworks>net6.0-android;net6.0-ios</TargetFrameworks>
<TargetFrameworks Condition=" '$(OS)' != 'Windows_NT' ">$(TargetFrameworks);net6.0-maccatalyst</TargetFrameworks>

单个多平台应用项目

.NET MAUI 的单个项目体验已经启用,你可以通过一个项目文件同时适配 Android、iOS 和 macOS;对于 Windows 的支持将会取决于 WinUI 3,因此这部分在未来会加入。

VS Solution

上图展示了单个项目中包含多个平台的开发体验。

共享字体、图片和应用图标

字体和图片也可以放到你的项目中的同一个位置,.NET MAUI 将允许你在所有平台上访问它们,例如:

<ItemGroup>
    <SharedImage Include="appicon.svg" ForegroundFile="appiconfg.svg" IsAppIcon="true" />
    <SharedFont Include="Resources\Fonts\ionicons.ttf" />
 </ItemGroup>

除了指定特定文件之外,还支持使用 wild-card 按照路径匹配所有的文件作为共享图片或者字体:

<ItemGroup>
    <SharedImage Include="appicon.svg" ForegroundFile="appiconfg.svg" IsAppIcon="true" />
    <SharedImage Include="Resources\Images*" />
    <SharedFont Include="Resources\Fonts*" />
</ItemGroup>

MAUI 应用使用 HostBuilder 启动程序

利用类似 ASP.NET Core 配置的体验配置 MAUI 程序,并支持依赖注入。例如:

public class Application : MauiApp
{
    public override IAppHostBuilder CreateBuilder() => 
        base.CreateBuilder()
            .RegisterCompatibilityRenderers()
            .ConfigureServices((ctx,services) =>
            {
                services.AddTransient<MainPage>();
                services.AddTransient<IWindow,MainWindow>();
            })
            .ConfigureFonts((hostingContext,fonts) =>
            {
                fonts.AddFont("ionicons.ttf","IonIcons");
            });

    public override IWindow CreateWindow(IActivationState state)
    {
        Microsoft.Maui.Controls.Compatibility.Forms.Init(state);
        return Services.GetService<IWindow>();
    }
}

新的控件处理器

.NET MAUI 引入了全新的控件处理机制,Preview 2 中包含第一组利用这些机制的控件:ButtonLabelEntrySliderSwitch。如果想要加速实现其他控件,也欢迎社区 PR,具体可见:https://github.com/dotnet/maui/wiki/Handler-Property-PR-Guidelines

.NET MAUI 的示例程序现在从同一个项目运行在 macOS、iOS 和 Android 上,以下是运行效果:

macOS:

macOS

iOS:

iOS

Android:

Android

移动 SDK 更新

Android

  • 将默认库设置为 Android X

iOS

  • Windows 上的开发者可以使用远程 iOS 模拟器
  • Windows 上的开发者可以连接到远程的 macOS 上构建应用
  • AOT 已经被添加和启用以支持部署和分发 iOS 应用

.NET 库更新

.NET 的库在 Preview 2 中也有不少更新。

System.Text.Json 忽略循环引用

System.Text.Json 现在支持忽略循环引用了,对于循环引用,可以不再抛出异常,而是像 Newtonsoft.Json 那样简单的设置成 null

class Node
{
    public string Description { get; set; }
    public object Next { get; set; }
}

void Test()
{
    var node = new Node { Description = "Node 1" };
    node.Next = node;

    var opts = new JsonSerializerOptions { ReferenceHandler = ReferenceHandler.IgnoreCycles };

    string json = JsonSerializer.Serialize(node,opts);
    Console.WriteLine(json); // 输出 {"Description":"Node 1","Next":null}
}

优先队列 PriorityQueue

.NET 6 Preview 2 加入了新的优先队列: System.Collections.Generic.PriorityQueue<TElement,TPriority>

// 创建一个 int 作为优先级的 string 队列
var pq = new PriorityQueue<string,int>();

// 各种元素入队
pq.Enqueue("A",3);
pq.Enqueue("B",1);
pq.Enqueue("C",2);
pq.Enqueue("D",3);

pq.Dequeue(); // 返回 "B"
pq.Dequeue(); // 返回 "C"
pq.Dequeue(); // 返回 "A" 或者 "D"

改进的数值格式解析

对于标准数值格式,我们改进了其解析器,尤其是针对 .ToString.TryFormat 的改进。精度大于小数点后 99 位时的结果现在已被改进,并且还提供了对尾部 0 的更好支持:

  • 32.ToString("C100")
    • .NET 6:32.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    • .NET 5:存在 99 位精度的限制
  • 32.ToString("H99")32.ToString("H100")
    • .NET 6:抛出 FormatException
    • .NET 5:H 是一个无效的格式修饰,但是没有抛出异常而是返回了错误结果
  • double.Parse("9007199254740997.0")
    • .NET 6:9007199254740996
    • .NET 5:9007199254740998

SignalR 的可空类型标注

SingleR 现在已经完成了可空类型的标注。

运行时更新

.NET 6 Preview 2 在运行时上也有不少改进。

框架程序集使用 Crossgen2 预编译

所有的 .NET 库现在已经使用 crossgen 2 进行预编译,目前只限于 .NET 的基础库,对于其他的库比如 ASP.NET Core 和 Windows Desktop,则会在后续的预览版本逐渐迁移到 crossgen 2。

Crossgen 2 本身并不是关注于性能改善的,而是用于启用新的性能特性(如 PGO)。不过 crossgen 2 带来了一些硬盘占用空间的改进:

Size [MB] FullName
--------- --------
64.22     C:Program FilesdotnetsharedMicrosoft.NETCore.App5.0.3
63.31     C:Program FilesdotnetsharedMicrosoft.NETCore.App6.0.0-preview.1.21102.12
63.00     C:Program FilesdotnetsharedMicrosoft.NETCore.App6.0.0-preview.2.21118.6

PGO

.NET 6 Preview 2 添加了以下改进:

JIT 改进

.NET 6 Preview 2 包含以下针对 JIT 的改进:

这些改进的结果分析可以在这里查看:

另外,对 ARM64 的优化也在不断和 ARM 工程师一起进行中。

结语

以上就是 .NET 6 Preview 2 中的改进内容了。

.NET 6 的功能改进将会在 7 月之前全部完成,之后就会专注于质量上的改进了。

原文地址:https://www.cnblogs.com/hez2010

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发、订阅和处理的流程。这种实现太简单了,百十行代码就展示了一个基本工作原理。然而,要将这样的解决方案运用到实际生产环境,还有很长的路要走。今天,我们就研究一下在事件处理器中,对象生命周期的管理问题。事实上,不仅仅是在事件处理器
上文已经介绍了Identity Service的实现过程。今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关。 回顾 《Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)》 Weather API Weather
最近我为我自己的应用开发框架Apworks设计了一套案例应用程序,并以Apache 2.0开源,开源地址是:https://github.com/daxnet/apworks-examples,目的是为了让大家更为方便地学习和使用.NET Core、最新的前端开发框架Angular,以及Apwork
HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务端接口的耦合度。很多当今流行的RESTful API开发框架,包括Spring REST,也都默认支
在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅、通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现。接下来对于事件驱动型架构的讨论,就需要结合一个实际的架构案例来进行分析。在领域驱动设计的讨论范畴,CQRS架构本身就是事件驱动的,因此,
HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单、统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable)更强,并具有自描述的特点。使用了HAL的API会更容易地被第三方开源库所调用,并且使用起来也很方便
何时使用领域驱动设计?其实当你的应用程序架构设计是面向业务的时候,你已经开始使用领域驱动设计了。领域驱动设计既不是架构风格(Architecture Style),也不是架构模式(Architecture Pattern),它也不是一种软件开发方法论,所以,是否应该使用领域驱动设计,以及什么时候使用
《在ASP.NET Core中使用Apworks快速开发数据服务》一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介绍,你会看到,使用Apworks框架开发数据服务是何等简单快捷,提供的功能也非常多,比如对Hypermedia的
在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证。在本讲中,我们会讨论在当前这种架构的应用程序中,如何完成用户授权。 回顾 《Angular SPA基于
Keycloak是一个功能强大的开源身份和访问管理系统,提供了一整套解决方案,包括用户认证、单点登录(SSO)、身份联合、用户注册、用户管理、角色映射、多因素认证和访问控制等。它广泛应用于企业和云服务,可以简化和统一不同应用程序和服务的安全管理,支持自托管或云部署,适用于需要安全、灵活且易于扩展的用
3月7日,微软发布了Visual Studio 2017 RTM,与之一起发布的还有.NET Core Runtime 1.1.0以及.NET Core SDK 1.0.0,尽管这些并不是最新版,但也已经从preview版本升级到了正式版。所以,在安装Visual Studio 2017时如果启用了
在上文中,我介绍了如何在Ocelot中使用自定义的中间件来修改下游服务的response body。今天,我们再扩展一下设计,让我们自己设计的中间件变得更为通用,使其能够应用在不同的Route上。比如,我们可以设计一个通用的替换response body的中间件,然后将其应用在多个Route上。 O
不少关注我博客的朋友都知道我在2009年左右开发过一个名为Apworks的企业级应用程序开发框架,旨在为分布式企业系统软件开发提供面向领域驱动(DDD)的框架级别的解决方案,并对多种系统架构风格提供支持。这个框架的开发和维护我坚持了很久,一直到2015年,我都一直在不停地重构这个项目。目前这个项目在
好吧,这个题目我也想了很久,不知道如何用最简单的几个字来概括这篇文章,原本打算取名《Angular单页面应用基于Ocelot API网关与IdentityServer4ʺSP.NET Identity实现身份认证与授权》,然而如你所见,这样的名字实在是太长了。所以,我不得不缩写“单页面应用”几个字
在前面两篇文章中,我介绍了基于IdentityServer4的一个Identity Service的实现,并且实现了一个Weather API和基于Ocelot的API网关,然后实现了通过Ocelot API网关整合Identity Service做身份认证的API请求。今天,我们进入前端开发,设计
Ocelot是ASP.NET Core下的API网关的一种实现,在微服务架构领域发挥了非常重要的作用。本文不会从整个微服务架构的角度来介绍Ocelot,而是介绍一下最近在学习过程中遇到的一个问题,以及如何使用中间件(Middleware)来解决这样的问题。 问题描述 在上文中,我介绍了一种在Angu
在大数据处理和人工智能时代,数据工厂(Data Factory)无疑是一个非常重要的大数据处理平台。市面上也有成熟的相关产品,比如Azure Data Factory,不仅功能强大,而且依托微软的云计算平台Azure,为大数据处理提供了强大的计算能力,让大数据处理变得更为稳定高效。由于工作中我的项目
在上文中,我们讨论了事件处理器中对象生命周期的问题,在进入新的讨论之前,首先让我们总结一下,我们已经实现了哪些内容。下面的类图描述了我们已经实现的组件及其之间的关系,貌似系统已经变得越来越复杂了。其中绿色的部分就是上文中新实现的部分,包括一个简单的Event Store,一个事件处理器执行上下文的接
在之前《在ASP.NET Core中使用Apworks快速开发数据服务》一文的评论部分,.NET大神张善友为我提了个建议,可以使用Compile As a Service的Roslyn为语法解析提供支持。在此非常感激友哥给我的建议,也让我了解了一些Roslyn的知识。使用Roslyn的一个很大的好处
很长一段时间以来,我都在思考如何在ASP.NET Core的框架下,实现一套完整的事件驱动型架构。这个问题看上去有点大,其实主要目标是为了实现一个基于ASP.NET Core的微服务,它能够非常简单地订阅来自于某个渠道的事件消息,并对接收到的消息进行处理,于此同时,它还能够向该渠道发送事件消息,以便