.NET 中备受追捧和期待已久的功能NativeAOT终于出现在本周的.NET 7 预览版2中,该项目的工作仍在继续,该版本将 NativeAOT 从实验性的 dotnet/runtimelab repo 中移出合并进入稳定的运行时库 dotnet/runtime repo,但尚未在 dotnet SDK 中添加足够的支持,以使用 NativeAOT 发布项目。完成此操作后,可以对实际测试进行完善了。

.NET NativeAOT 编译器脱离实验性质正式跟随 .NET 7 Preview 2 发布到了官方 nuget 源:https://www.nuget.org/packages/Microsoft.DotNet.ILCompiler

从现在开始,7.0.0-* 版本基本可以放心用在生产环境。我们可用开始尝试修剪我们的应用程序,并确保没有剪裁警告。剪裁是 NativeAOT 的要求。GitHub 问题 .NET 7 中的 NativeAOT #61231 显示了正在检查的初始工作以及第一阶段的剩余工作:

NativeAOT 这个功能的完整支持真是不容易,具体怎么用可用参考 hez2010的文章:通过 .NET NativeAOT 实现用户体验升级

这里来回顾一下这个历程:具体内容来自知乎的hez2010 的整理的内容 https://www.zhihu.com/question/472875939

Native AOT (2021.1~2021.7)的进展:

  • 托管类型系统的完善,支持了泛型接口的默认方法实现,但是还是不支持接口的泛型默认方法实现,因为这部分要对类型系统做很多的改动。
  • COM 支持基本做完了,因此现在的 Native AOT 已经可以成功编译和运行 winforms 程序了(需要 COM Wrapper),WPF、WinUI 和 UWP 也在实验中,但是 WPF 涉及到 C++/CLI,这部分无法静态链接进去,不太可能获得 Native AOT。
  • 泛型虚方法懒实例化(GVM Instantiation),不需要在编译的时候就实例化所有的泛型虚方法,而是留在运行时第一次调用时来做,这么做不仅不会损失性能,而且还能节省大量的编译后体积,并避免泛型虚方法递归实例化导致的编译时无限递归展开问题。但是并没有完全解决无限泛型递归的问题,由于并行编译没法使用强联通分量算法进行检测。
  • 支持了动态调用标注,然后对 .NET 6 的 BCL 进行了标注,因此大多数情况即使基础库某些方法里用到了反射创建类型,也不会出现运行时找不到代码的问题,因为框架自己做了标注,编译的时候编译器就能知道并生成代码,而无需人工编写大量的 rd.xml 标注信息。
  • 目前正在添加托管类型系统对静态虚方法的支持(已有 PR)。
  • 目前正在添加对 PS4/PS5 等平台的支持(缓慢进展,可以运行起来简单程序了)。
  • 目前正在添加对 WASM 平台的支持(缓慢进展,可以运行起来简单程序了)。
  • 支持了 ARM64 平台。
  • 支持了静态链接依赖项。
  • 支持使用 .NET 6 的静态 PGO 数据做优化编译。
  • 编译速度的改善也是能明显看得到的,以前的旧版本 CoreRT 编译个程序动辄十分钟半小时,现在基本半分钟一分钟都能搞定。
  • 2021/8/12 更新:

    1. 正在添加对 ARMv7 平台的支持(已有 PR)
    2. 正在添加对接口泛型方法默认实现的支持(已有 PR)

    2021/8/14 更新:

    1. 接口泛型方法默认实现已支持,因此 efcore 可以用 NativeAOT 了
    2. 泛型虚拟方法解析速度有所提升(大概 8%),编译时间更短了

    2021/8/17 更新:

    1. NativeAOT 在 .NET 6 上计划的内容已经完成,已经可以稳定使用,另外可能会在 .NET 7 脱离实验正式发布
    2. ARMv7 平台支持已接近完成

    2021/8/24 更新:

    1. NativeAOT 编译器版本已提升至 7.0.0-*

    2021/9/6 更新:

    1. 正在适配安卓
    2. LLVM 从 6 升级到 12
    3. 完善 IDynamicInterfaceCastable 支持,对 COM 的支持度进一步改善

    2021/9/17 更新:

    1. 支持了模块初始化器
    2. 正在添加对 x86 的支持

    2021/12/6 更新:

    1. Native AOT 转正正式提上 .NET 7 计划

    2021/12/15 更新:

    1. Native AOT 代码正式合并入 .NET 主线并启用了构建
    2. 无限泛型展开导致无法编译的问题已经解决

    2022/3/17 更新:

    1. 正式在.NET 7 Preview 2博客文章中宣布可用。

    .NET 7 预览版2 的亮点之 NativeAOT 正式合并入 .NET 主线的更多相关文章

    1. CPF C#跨平台UI框架发布安卓端预览版

      CPF的安卓端适配采用Xamarin的安卓绑定库,而不是Xamarin.Form.CPF和flutter差不多,完全由skia绘制,基本不依赖原生控件. 当前还只是预览版,不建议用在正式项目中. 可能 ...

    2. .NET机器学习 ML.NET 1.4预览版和模型生成器更新

      ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架. ML.NET  还包括Model Builder  (一个简单的UI工具)和  CLI  ,使用自动机器学习(AutoML)构建自定义 ...

    3. [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)

      前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...

    4. 微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server

      微软已经发布 Windows Server 2016 和 System Center 2016 第三个技术预览版,已经提供下载.Windows Server 2016 技术预览版第三版也是首个包括了容 ...

    5. Win10桌面预览版14316更新内容大全

      下载更新: 安装之后右下角: Win10桌面预览版14316更新内容:       Windows上运行乌班图Bash:通过设置开启开发者模式,更新和安全>面向开发人员.然后搜索"Wi ...

    6. .NET 4.5.1 预览版新特性

      上个月的微软Build大会上宣布了.NET 4.5.1的推出,Heydarian的这个演讲题为".NET开发中的新内容",涵盖了.NET Framework中一些重要的新特性. H ...

    7. Windows 10 技术预览版9926 “未知源”引起系统休眠后自启的解决办法

      问题的由来: 自从安装上了最新发布的Windows 10 ,使用起来有诸多的改进:无论是重绘的图标还是通知消息中心的整合还是更智能的OneDrive客户端都使得工作起来非常愉悦. 不过笔者这两天频繁遇 ...

    8. Windows 10预览版14316开启Bash命令支持

      00x0 前言 4月7日凌晨,微软推送了最新的Windows 10一周年更新预览版14316,其中重要的是原生支持Linux Bash命令行支持. 00x1 问题 如何开启Linux Bash命令行? ...

    9. win10预览版9926升级10049操作步骤

      文章转自:豆豆系统收藏备用 win10预览版系统安装的用户非常多,现在最新版本已经到了10049,但是之前很多装了9926版本或者10041版本的同学在通过系统自动更新的时候,且发现,微软官方提供的速 ...

    随机推荐

    1. 如何使Label显示时,一行顶部居中,两行靠左显示----董鑫

      有时我们会碰到这种情况,一个要根据内容显示一行还是两行,一行时还要靠着顶部再居中,比如下面 最左边的名称,要求是靠上的,如果按照正常的方式写的话,可能一行的话就会出现居中显示了,不会顶着头部显示. 我 ...

    2. Apache——网页优化与安全

      Apache--网页优化与安全 1.Apache 网页优化概述 2.网页压缩 3.网页缓存 4.隐藏版本信息 5.Apache 防盗链 1.Apache 网页优化概述: 企业中,部署Apache后只采 ...

    3. python基础语法_闭包详解

      https://www.cnblogs.com/Lin-Yi/p/7305364.html 闭包有啥用??!! 很多伙伴很糊涂,闭包有啥用啊??还这么难懂!  3.1装饰器!!!装饰器是做什么的??其 ...

    4. 1、Golang基础--Go简介、环境搭建、变量、常量与iota、函数与函数高级

      1 Go语言介绍 1 golang-->Go--->谷歌公司 2009年 golang:指go语言,指的go的sdk goland:软件,ide:集成开发环境 Java写的 2 Go是静态 ...

    5. Memory Management in Rust

      程序在运行时需要请求操作系统分配内存以及释放内存,因此,程序员在编写程序时,需要显式(手动)地编写分配和释放内存的代码,或者隐式(自动,由语言保证)地进行内存管理.对于前者,C/C++ 是代表语言,程 ...

    6. 暑假撸系统6- Thymeleaf ajax交互!

      本来用Thymeleaf也没想着深度使用ajax,就是用也是非常传统的ajax方式提交然后js控制修改下变量.闲来无事的时候看Thymeleaf的教程发现一哥们的实现方式,以及实现思路,堪称惊奇,先说 ...

    7. INTERSPEECH 2015 | Scalable Distributed DNN Training Using Commodity GPU Cloud Computing

      一般来说,全连接层的前向和后向传递所需的计算量与权重的数量成正比.此外,数据并行训练中所需的带宽与可训练权重的数量成比例.因此,随着每个节点计算速度的提高,所需的网络带宽也随之增加.这篇文章主要是根据 ...

    8. Zookeeper 提供的API

      上篇介绍了Zookeeper命令行相关的知识,本小作文介绍从另一个维度操作Node相关的内容:Zookeer的API.同样借用Zookeeper应用之一的数据注册与订阅中的案例类比命令行操作,重点介绍 ...

    9. 『无为则无心』Python面向对象 — 53、对Python中封装的介绍

      目录 1.继承的概念 2.继承的好处 3.继承体验 4.单继承 5.多继承 1.继承的概念 在Python中,如果两个类存在父子级别的继承关系,子类中即便没有任何属性和方法,此时创建一个子类对象,那么 ...

    10. Meterpreter后渗透阶段关闭防火墙与杀毒软件