上周微软开发团队发布发布.NET6Preview2。该版本引入了全新的API,运行时性能的改进以及.NETMAUI的早期构建以及对AppleSilicon的构建。
官方下载页面已经提供适用于Windows,macOS和Linux的二进制安装包、容器镜像、Linux发行包,可供下载尝鲜。
官方表示.NET6已通过在VisualStudio16.9和VisualStudioforMac8.9测试通过,建议使用这些版本试用。
支持
.NET6正式版本将于年11月发布,并且有长达三年的长期支持(LTS)版本支持。与.NET5相比,各方面已得到显著扩展,新增加对安卓、iOS、Mac和MacCatalyst,用于x64和AppleSilicon(又称“M1”)以及WindowsArm64(特别是Windows桌面)的支持。
.NET6以大家对容器的支持,.NET6Debian容器镜像(基于Debian11,“bullseye)也正在测试中。
改善.NET内部循环性能
对于所有.NET版本,性能都是最重要的。在过去的几个版本中,为提高吞吐量,减少内存消耗以及其他影响应用程序稳态性能的因素付出了很多努力。.NET6,将重点放在两个方面,其中一些方面是.NET6主题之一的一部分:提高.NET开发人员的内循环性能,希望确保开发人员能够尽可能提高工作效率,优化经常在其内部循环中使用的工具和工作流程。。
.NET6另一个是.NET热装载。通过允许在运行应用程序时甚至在未连接调试器的情况下对代码进行编辑,热装载将在所有受支持的操作系统和硬件平台上提高开发人员的生产率。想要对应用程序或服务进行更改时,无需停止它并经历典型的内部循环周期,即进行更改,构建,运行并回到触发需求的应用程序或服务中对于最初的更改,可以跳过整个周期进行多种编辑。该功能涉及的工作跨越.NET版本,需要在运行时(coreclr和mono)上,C#Roslyn编译器,应用程序模型(例如Blazor,.NETMAUI)和开发人员工具(例如CLI,VisualStudio),但有望从根本上改善.NET开发人员编写其应用和服务的方式。
移动和多平台应用APP开发
.NET6最令人兴奋的部分之一是移动开发,目前作为单独的Xamarin产品提供。在.NET6中,iOS,Android和macOS开发将集成到.NETSDK体验中,并使用.NET库。Mono也将打包到.NET中,开发人员可以利用两个运行时优势,而不必考虑不同的.NET版本,也不必担心兼容性问题。
.NET6中所有的.NET应用程序都将在相同的库上运行。Xamarin的跨平台UI框架Xamarin.Forms演变成.NETMAUI多平台应用程序UI,使用户可以使用一套代码库轻松适配iOS,Android,Windows和macOSAPP。.NETMAUI作为.NET6的一部分提供,同时还进行了一系列性能和工具改进,例如.NET/C#HotReload,跨不同平台的更多共享资源和代码,以及具有一组更灵活的UI控件的更好的页面呈现性能。
.NETMAUI不仅适用于客户端应用程序开发人员。得益于重构的控件集以及可以在.NET6库上运行的功能,现有的Blazor应用程序可以通过.NETMAUI在Windows和macOS上本地运行。能够与Blazor代码库无缝地结合本机控件和功能,包括特定于平台的功能。
对于打包,部署和发布的跨平台客户端应用程序。由于开发应用程序的开发人员/目标平台/方式太多,开发者需要分发许多不同的应用程序包。.NET推出了改善本地和云中发行和版本控制的策略,桌面开发人员可以将其应用程序打包、分发、发布和更新到多个桌面平台和体系结构。在.NET6中,将能够:
使用.NET库构建iOS,Android和macOS应用程序。
用.NETMAUI在相同的代码库中创建iOS,Android,Windows和macOS应用程序。
跨平台共享更多代码和资源(例如图像,应用程序图标/清单等)。
在macOS和Windows上本地运行BlazorWeb应用程序。
轻松打包和分发包含的所有目标框架的应用程序。
多平台APP用户界面
.NET6添加了.NETMAUI和针对Android,iOS和MacCatalyst的单个项目开发人员的经验。
MacCatalyst
可以使用MacCatalyst将以下TargetFramework设置添加到项目中,进行macOS桌面进行构建
TargetFrameworksnet6.0-android;net6.0-ios/TargetFrameworks
TargetFrameworksCondition=$(OS)!=Windows_NT$(TargetFrameworks);net6.0-maccatalyst/TargetFrameworks
多目标的应用程序项目
.NETMAUI应用程序已经有了单个项目体验。用户可以获得可以在Android,iOS和macOS上运行的非常干净的解决方案。Windows支持取决于WinUI3,它现在已在其预览版中。目前需要从命令行进行构建和运行。VisualStudio的未来版本将添加设备选择和运行选项。
共享的字体,图像和应用程序图标
字体和图像可以放置在解决方案中的一个位置,.NETMAUI可以使它们在目标平台上本地运行。在项目的*.csproj文件中以SharedImage和SharedFont定义:
ItemGroup
SharedImageInclude=appicon.svgForegroundFile=appiconfg.svgIsAppIcon=true/
SharedFontInclude=Resources\Fonts\ionicons.ttf/
/ItemGroup
两者都接受通配符以包含一个位置中的所有文件。
ItemGroup
SharedImageInclude=appicon.svgForegroundFile=appiconfg.svgIsAppIcon=true/
SharedImageInclude=Resources\Images*/
SharedFontInclude=Resources\Fonts*/
/ItemGroup
MauiApp与HostBuilder共同引导应用程序
新增用于配置服务,字体和兼容性渲染器以扩展Xamarin.Forms项目迁移的扩展。IWindow已在将来的版本中引入了多窗口支持。新模式还为库作者和控件供应商提供了一个统一的地方,可与.NETMAUI集成。
publicclassApplication:MauiApp
{
publicoverrideIAppHostBuilderCreateBuilder()=
base.CreateBuilder()
.RegisterCompatibilityRenderers()
.ConfigureServices((ctx,services)=
{
services.AddTransientMainPage();
services.AddTransientIWindow,MainWindow();
})
.ConfigureFonts((hostingContext,fonts)=
{
fonts.AddFont(ionicons.ttf,IonIcons);
});
publicoverrideIWindowCreateWindow(IActivationStatestate)
{
Microsoft.Maui.Controls.Compatibility.Forms.Init(state);
returnServices.GetServiceIWindow();
}
}
新的控制处理程序
实现新处理程序方法的第一个控件和属性。这些包括Button,Label和Entry,Slider和Switch的部分实现。下面的HelloMaui示例应用程序,支持从单一项目的MacOS,iOS版和Android运行:
移动SDK的更新
在新版本中,移动SDK和周围的工具也正在不断增加中。这些功能将与将来的VisualStudio发行版集成在一起,并将继续得到改进。
安卓:
AndroidX库现已可用于.NET6,并且是Android应用程序的默认依赖项
iOS:
Windows上的开发人员可以使用远程iOS模拟器
Windows上的开发人员可以连接到远程Mac构建主机
提前编译已添加,可用于构建和部署到物理iOS硬件
.NET库
.NET库中已添加了以下API和改进。
System.Text.Json–ReferenceHandler.IgnoreCycles
JsonSerializer(System.Text.Json)现在支持序列化对象图时忽略循环功能。这ReferenceHandler.IgnoreCycles选项具有与Newtonsoft.Json相似的行为ReferenceLoopHandling.Ignore。一个主要区别是System.Text.Json实现将引用循环替换为nullJSON令牌,而不是忽略对象引用。
以下示例中展示了ReferenceHandler.IgnoreCycles行为,在这种情况下,Next属性序列化为null,以避免形成一个死循环。
classNode
{
publicstringDescription{get;set;}
publicobjectNext{get;set;}
}
voidTest()
{
varnode=newNode{Description=Node1};
node.Next=node;
varopts=newJsonSerializerOptions{ReferenceHandler=ReferenceHandler.IgnoreCycles};
stringjson=JsonSerializer.Serialize(node,opts);
Console.WriteLine(json);//Prints{Description:Node1,Next:null}
}
PriorityQueue
PriorityQueueTElement,TPriority(System.Collections.Generic)是一个新集合,可以添加具有值和优先级的新项目。出队时,PriorityQueue返回具有最低优先级值的元素。可以认为这个新收藏类似于QueueT但是每个入队元素的优先级值都会影响出队行为。
下面的示例演示PriorityQueuestring,int行为:
varpq=newPriorityQueuestring,int();
pq.Enqueue(A,3);
pq.Enqueue(B,1);
pq.Enqueue(C,2);
pq.Enqueue(D,3);
pq.Dequeue();//returnsB
pq.Dequeue();//returnsC
pq.Dequeue();//eitherAorD,stabilityisnotguaranteed.
更好地解析标准数字格式
新改进了标准数字类型的解析器,特别是针对.ToString和.TryFormat。当指定精度99个小数位时,它们将提供更好的结果。而且,解析器现在可以更好地支持Parse方法。
32.ToString(C)-C
.NET6:$32.
.NET5:Wehadanartificiallimitationintheformattingcodetoonlyhandleaprecisionof=99.
32.ToString(H99)-throwaFormatException
.NET6:throwsaFormatException
32.ToString(H)-H
.NET6:throwaFormatException
.NET5:Hisaninvalidformatspecifier.So,weshould’vethrownaFormatException.Instead,ourincorrectbehaviorofinterpretingprecision=ascustomformatsmeantwereturnedwrongvalues.
double.Parse(.0)-
.NET6:.
.NET5:.0isnotexactlyrepresentableintheIEEEformat.
SignalR可空注释
在ASP.NET核心SignalR客户端软件包已被注释为可空属性。当C#编译器将提供适当的反馈启用nullability时基于SignalRAPI中对null的处理方式。
可空是.NETCore3.x和.NET5发行版的重点。所有.NET库(也称为“基类库”)都作为这些发行版的一部分进行了注释。
运行时
.NET运行时已进行了以下改进(或与之相关)。
框架程序集使用Crossgen2进行编译
所有.NET库都使用crossgen2编译跨所有受支持的操作系统和体系结构进行。包括Microsoft.NETCore.App目录,例如ASP.NET或WindowsDesktop。这些框架将在Preview3和/或4中过渡到crossgen2。
Crossgen2的目的是启用新的性能功能,例如PGO。Crossgen2基于一些针对性的大小优化提供了适度的磁盘上大小改进,如下面的比较所示。要点是转移到Crossgen2不会引起任何前期回归。
Size[MB]FullName
-----------------
64.22C:ProgramFilesdotnetsharedMicrosoft.NETCore.App5.0.3
63.31C:ProgramFilesdotnetsharedMicrosoft.NETCore.App6.0.0-preview.1..12
63.00C:ProgramFilesdotnetsharedMicrosoft.NETCore.App6.0.0-preview.2..6
配置文件引导的优化
概要文件引导的优化使用户能够生成基于各种特征而最佳的代码。目前正在构建静态和动态PGO变体。在预览2中进行了以下改进:
允许间接支持CSE和提升vtable查找;
分层编译中的块计数;
允许内联配置文件按比例放大;
有效的配置方案(例如,具有有效边缘检测功能的生成树);
JIT改进
为了优化JIT生成的代码,进行了以下改进。
不非对其clone循环;
MultiplyHighintrinsics功能;
第二项改进特定于Arm64。将继续提高JIT为Arm64生成的代码的性能。