.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 命令,例如 newbuild 和 run

目前已包含的改进例如:

  • 避免工具出现意料之外的 JIT:https://github.com/dotnet/installer/pull/9635

  • 避免未启用日志时产生日志相关的昂贵开销:https://github.com/dotnet/aspnetcore/pull/27956

  • 优化 MSBuild:https://github.com/dotnet/msbuild/pull/6151

  • 使用代码生成器替换原 Razor 编译器以加快编译速度:https://github.com/dotnet/sdk/pull/15756

  • 优化访问文件的方式以减少触发反病毒软件的扫描:https://github.com/dotnet/runtime/pull/48774

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

上图展示了 .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 的桌面应用:

Copy<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,因此这部分在未来会加入。

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

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

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

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

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

Copy<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 程序,并支持依赖注入。例如:

Copypublic 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 中包含第一组利用这些机制的控件:ButtonLabelEntrySlider 和 Switch。如果想要加速实现其他控件,也欢迎社区 PR,具体可见:https://github.com/dotnet/maui/wiki/Handler-Property-PR-Guidelines 。

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

macOS:

iOS:

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

Copyclass 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>

Copy// 创建一个 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 带来了一些硬盘占用空间的改进:

CopySize [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 添加了以下改进:

  • Allow CSE & hoisting of vtable lookups for the indirections — dotnet/runtime #47808

  • Block counts in tiered compilation — dotnet/runtime #13672

  • Allow Inlinee profile scale-up — dotnet/runtime #48280

  • Efficient profiling scheme (e.g., spanning tree with efficient edge instrumentation) — dotnet/runtime #46882, dotnet/runtime #47509, dotnet/runtime #47476, dotnet/runtime #47072, dotnet/runtime #47597, dotnet/runtime #47723, dotnet/runtime #47876, dotnet/runtime #47959

JIT 改进

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

  • Not aligning cloned loops — dotnet/runtime #48090

  • MultiplyHigh intrinsics (smulh/umulh) — dotnet/runtime #47362

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

  • 2021 年 1 月 26 日:https://github.com/dotnet/runtime/issues/43227#issuecomment-767967603

  • 2021 年 2 月 3 日:https://github.com/dotnet/runtime/issues/43227#issuecomment-772914110

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

结语

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转]ArcGIS.Server.9.3和ArcGIS API for Flex实现Toolbar功能(四)

目的&#xff1a;1.ArcGIS API for Flex实现Toolbar功能&#xff0c;包括ZoomIn、ZoomOut、Pan、PrevExtent、NextExtent、FullExtent功能。准备工作&#xff1a;1.这次地图数据就用Esri提供的http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/Ma…

物理学家史蒂夫·霍金逝世,享年76岁(附图文回顾他的一生)

3月14日消息&#xff0c;据英国天空新闻等多家媒体报道&#xff0c;史蒂芬威廉霍金&#xff08;Stephen William Hawking&#xff09;去世&#xff0c;享年76岁&#xff08;1942年1月8日&#xff0d;2018年3月14日&#xff09;。这一消息已经得到霍金家人确认。霍金的三个孩子露…

mysql数据库熟悉表空间数据文件_Oracle表空间和数据文件

Oracle创建表空间 1.创建普通表空间create tablespace oracle_tablespacedatafileOracle创建表空间1.创建普通表空间create tablespace oracle_tablespacedatafile /home/oracle/oradata/orcl/oracle_tablespace.dbfsize 100mautoextend on next 10M maxsize 200Mextent manage…

2018年最值得关注的15大技术趋势,区块链将得到更广泛的应用

通常情况下&#xff0c;技术趋势是很难准确预测的&#xff0c;因为预测未来本身就极其困难。但是我们还是可以从过往的一些显著数据指标来推测新的一年里科技行业的发展趋势。2018&#xff0c;有哪些值得关注的技术趋势&#xff1f;01 区块链将得到更广泛的应用

Visual Studio项目引用出现感叹号怎么办?

原因可能有多种&#xff1a;第一种问题&#xff1a;解决方式1&#xff1a;今天换了台电脑&#xff0c;就把笔记本上的项目拷贝到了台式机上&#xff0c; 但是我没有拷贝解决方案整个文件夹&#xff0c;因为其中项目太多了&#xff0c;我就把其中一个项目的文件夹直接拷贝到电脑…

离职总结:大公司与小公司的个人体验

离职在即&#xff0c;在准备下一个工作环境的这段时间&#xff0c;忽然有一阵感慨&#xff0c;工作近五年&#xff0c;在这段时间中&#xff0c;体验了两种不同的工作环境&#xff1a;一个规模很大&#xff0c;各种开发体系完备的大公司&#xff0c;另一个&#xff08;也是目前…

java导入导出excel_Java导入导出Excel工具 easyexcel

Java导入导出Excel工具 easyexcel做Java开发的同学&#xff0c;尤其是做管理后台的同学绝大多数都会接触到报表系统&#xff0c;这时候就少不了Excel的导入和导出了。Java解析生成Excel比较有名的有Apache POI &#xff0c;但是POI存在缺陷就是所有的数据的解析都是在内存中进…

浅谈.Net Core后端单元测试

1. 前言单元测试一直都是"好处大家都知道很多,但是因为种种原因没有实施起来"的一个老大难问题。具体是否应该落地单元测试&#xff0c;以及落地的程度, 每个项目都有自己的情况。本篇为个人认为"如何更好地写单元测试", 即更加偏向实践向中夹杂一些理论的…

图论的各种基本算法

本篇主要涉及到图论的基本算法&#xff0c;不包含有关最大流的内容。图论的大部分算法都是由性质或推论得出来的&#xff0c;想朴素想出来确实不容易。二分图(Is-Bipartite)一个图的所有顶点可以划分成两个子集&#xff0c;使所有的边的入度和出度顶点分别在这两个子集中。这个…

社区 正式发布了跨平台的 CoreWCF 0.1.0 GA

CoreWCF 项目在2021.2.19 正式发布了0.1.0 GA版本:https://github.com/CoreWCF/CoreWCF/releases/tag/v0.1.0 &#xff0c;这个版本号虽然是0.1&#xff0c;但是它是可以投入生产的版本&#xff0c;而且是跨平台的&#xff0c;支持LInux部署WCF&#xff0c;当前仅支持http 和 n…

Prim 算法及其高效实现

转自&#xff1a;ivy-endhttp://www.ivy-end.com/archives/943背景最小生成树&#xff08;Minimum Spanning Trees&#xff09;&#xff0c;简称MST。是图论中一个非常重要的概念。解决这个问题有两种算法&#xff0c;今天暂且先来讨论一下Prim Algorithm。不做特别说明&#x…

Silverlight实例教程 - Validation数据验证开篇

说起来Validation验证功能&#xff0c;相信大家都不陌生&#xff0c;在应用中&#xff0c;当需要用户交互输入时&#xff0c;开发人员都会加入一些验证代码&#xff0c;这样可以有效的避免应用异常出现&#xff0c;也可以使应用的错误提示信息清晰明了的显示在客户端&#xff0…

一日一技:微信扫码用户帐号绑定

概述最近在整一个微信扫码用户帐号绑定功能。为了满足用户帐号绑定场景的需要&#xff0c;通过生成用户自己的二维码&#xff0c;用户扫描后&#xff0c;公众号可以接收到事件推送。如下1、用户登录扫码2、绑定成功实现思路扫码绑定账户&#xff0c;其实就是扫描带有用户信息的…

计算机起源的数学思想

人类的历史可以看做一部关于解放的历史。也有这样的说法&#xff0c;懒惰是人类进步的动力。为了偷懒&#xff0c;人类不断的做着各种努力&#xff0c;发明了各种机器工具&#xff0c;将自己从繁重的劳动解放出来&#xff0c;另一方面&#xff0c;每一次大的进步&#xff0c;都…

Redis 通过 RDB 方式进行数据备份与还原

Redis 通过 RDB 方式进行数据备份与还原Intro有的时候我们需要对 Redis 的数据进行迁移&#xff0c;今天介绍一下通过 RDB&#xff08;快照&#xff09;文件进行 Redis 数据的备份和还原Redis 持久化Redis 的数据持久化有两种机制&#xff0c;一种是 RDB(Redis Database)&#…

java proguard 使用_一步步教你使用Proguard混淆Java源代码

ava代码很容易被反编译&#xff0c;以下使用proguard来保护我们的代码proguard选项很多&#xff0c;容易迷糊&#xff0c;现在就把我的配置写下来(实际使用中)&#xff0c;以供参考2.准备好你的jar包&#xff0c;我在这里举例叫做test.jar。3.解压proguard&#xff0c;执行 bin…

稳定匹配问题——稳定婚姻算法设计

图片源自&#xff1a;美剧《How I met your mother》****本代码带有详细的注释&#xff0c;并在控制台输出时详细地说明了算法的过程&#xff0c;非常有助于新手理解稳定匹配问题和稳定婚姻算法的设计思路。****#include <iostream>using namespace std;bool finish_or_n…

如果诸葛亮用C#写出师表...

❝看到一篇18年的文章 "C版《出师表》"&#xff0c;站长觉得挺有意思的&#xff0c;就用C# 控制台也实现了一遍&#xff0c;技术上没啥难度&#xff0c;但复制代码费了1、2个小时&#xff0c;纯粹无聊写着玩&#xff0c;看者别在意枚举、类名、变量中文命名&#xff…

这16个数据可视化案例,惊艳了全球数据行业

数据可视化可以帮你更容易的解释趋势和统计数据。数据是非常强大的。当然&#xff0c;如果你能真正理解它想告诉你的内容&#xff0c;那它的强大之处就更能体现出来了。通过观察数字和统计数据的转换以获得清晰的结论并不是一件容易的事。必须用一个合乎逻辑的、易于理解的方式…

asp.net core 自定义 Content-Type

asp.net core 实现支持自定义 Content-TypeIntro我们最近有一个原本是内网的服务要上公网&#xff0c;在公网上有一层 Cloudflare 作为网站的公网流量提供者&#xff0c;CloudFlare 会有一层防火墙拦截掉一些非法的请求&#xff0c;我们有一些 API 会提交一些 html 内容&#x…