前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >.NET 的 Native AOT 现在是什么样的?

.NET 的 Native AOT 现在是什么样的?

作者头像
张善友
发布于 2025-02-04 00:55:30
发布于 2025-02-04 00:55:30
2290
举报
文章被收录于专栏:张善友的专栏张善友的专栏

软件开发领域,优化性能和简化效率仍然至关重要。多年来,.NET 平台一直在创新,为开发人员提供基础设施,以打造弹性和高效的软件解决方案。今天要写的这篇文章源自昨天在朋友圈发的文章《UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化》[1],一位小伙伴的对话让我想全面梳理下Native AOT的现在的进展。

image
image
什么是 .NET Native AOT?

.NET Native Ahead-of-Time (AOT) 编译是 .NET 平台中的一项前沿进步。使用 AOT 时,C# 代码在开发人员计算机上被编译为本机代码。这与在运行时将代码编译为本机代码的传统方法形成鲜明对比。

下面的架构说明了这一点。.NET 传统编译涉及两个步骤:

  1. C# 编译生成包含中间语言 (IL) 代码的 DLL 文件。此类 DLL 称为 .NET 程序集
  2. 执行 .NET 程序时,.NET 运行时CLR 公共语言运行时)将加载 .NET 程序集。CLR 的子系统负责将 IL 代码编译为由 CPU 直接执行的本机代码。此子系统称为 JIT (Just-In-Time) 编译器。它之所以得名,是因为它仅在首次调用该方法时编译该方法的 IL 代码。

另一方面,.NET Native AOT 编译由一个步骤组成。将 C# 源代码编译为开发人员计算机上的本机代码。此过程包括将 C# 代码转换为 IL 代码,然后转换为 Native 代码,形成一个两步编译过程。但这是一个实现细节。这就是 AOT .NET 程序集 框在下面的架构中为灰色的原因。

image
image
.NET Native AOT 的优势

.NET Native Ahead-of-Time (AOT) 编译带来了一系列优势:

  • 增强的性能:通过将代码预编译为本机计算机指令,.NET Native AOT 显著缩短了启动时间并提高了应用程序的整体性能。在服务器方案中,如果应用程序针对每个请求启动,这可能会产生重大差异。此外,运行时没有 JIT 编译开销,这意味着执行速度更快,从而提供更流畅的用户体验。
  • 简化部署:AOT 编译的应用程序通常会导致依赖项为零或较少的独立可执行文件。这简化了部署过程,可以更轻松地在各种平台和设备之间分发应用程序,而无需额外的安装或运行时组件。
  • 更小的应用程序大小:通过修剪不必要的代码,AOT 可以大大减小应用程序的大小。这不仅可以节省存储空间,还可以优化应用程序的内存占用,这在移动设备或 IoT 设备等资源受限的环境中尤为重要。
  • 增强的知识产权保护:AOT 编译将源代码转换为优化的机器代码,这使得逆向工程尝试更具挑战性。生成的本机代码比 IL 代码更加模糊,并且难以破译,因为 IL 代码可以轻松反编译为原始 C# 代码。这增强了应用程序中嵌入的敏感算法、业务逻辑和专有方法的安全性。
.NET Native AOT 的缺点

使用 AOT 获得的好处不可避免地伴随着某些缺点。他们是:

  • 特定于平台的编译:.NET Native AOT 生成特定于平台的本机代码,针对特定体系结构或操作系统进行定制。例如,与常规 .NET 程序集不同,在 Windows 上使用 AOT 生成的可执行文件在 Linux 上不起作用。
  • 不支持跨 OS 编译。例如,在 Windows 机器上,您无法编译 Linux 本机版本,反之亦然。
  • 对 Reflection 的部分支持:反射依赖于动态代码生成和运行时类型发现,这与 AOT 编译代码的预编译和静态性质相冲突。但是,通常的 Reflection 用法与 AOT 配合得很好。
  • 需要 AOT 兼容的依赖项:AOT 编译要求项目中使用的所有库和依赖项都与 AOT 兼容。依赖于反射、运行时代码生成或其他动态行为的库可能与 AOT 不兼容,这可能会导致冲突或运行时错误。
  • 增加构建时间:AOT 编译涉及在构建过程中预先生成本机代码。这个额外的步骤会显著增加构建时间,特别是对于大型项目或具有大量代码库的应用程序。
  • 需要适用于 C++ 的桌面开发工具:AOT 只能在安装这些工具的情况下进行编译,这些工具在您的硬盘驱动器上最多可重 7GB。

.NET 9 的 Native AOT(Ahead-of-Time Compilation)是微软在.NET 9版本中重点发展的一项技术,旨在提升应用程序的性能。Native AOT 技术可以将.NET 代码预先编译为本地代码,从而实现更快的启动时间和更高的执行效率。

在.NET 9中,微软已经将Native AOT作为提升性能的关键点之一[2]。此外,微软还宣布了对通用Windows平台(UWP)的初步支持,允许开发者使用.NET 9和Native AOT技术来现代化改造现有的UWP应用。这一举措为UWP开发者提供了一条升级路径,使他们能够利用最新的.NET和Native AOT技术来改进其应用程序。 .NET 9的Native AOT不仅限于UWP平台,它还支持老旧的Windows 7和XP环境,这标志着AOT技术在兼容性方面的突破。然而,对于Android平台的Native AOT支持,目前尚未完成,尤其是JNI(Java Native Interface)支持,这被认为是一个较大的功能需求,还有WPF/Winform 的Native AOT支持也需要在.NET 10 才能够完成。

.NET 的Native AOT技术通过在编译阶段对代码进行优化,使得生成的可执行文件更小且启动速度更快。这一突破性功能不仅实现了对老旧Windows 7和Windows XP环境的支持,还为性能要求高且依赖旧版系统的开发者提供了新的可能性。具体来说,.NET 9版本中,为了确保向下兼容性,X86架构下的AOT(Ahead-of-Time)编译器的支持扩展,.NET 9采用了精心设计的编译策略,确保了对Win7及XP API的兼容性,使代码能够无缝运行,允许开发人员将应用程序在编译阶段就优化为能够在老旧的Windows系统上运行。LoongArch架构和Risc-V架构下的AOT 编译器支持,社区也在继续完善之中。

在.NET 9中,对Native AOT(按需编译)支持和JNI(Java Native Interface)的支持有以下具体进展:

  • 在.NET 9中,引入了两个新的属性,允许开发者设计功能开关。这些功能开关可以在.NET库(以及你自己)中使用来切换某些功能区域。如果一个功能不被支持,在裁剪或使用Native AOT进行编译时,将移除那些不受支持且不必要的功能,从而减小应用程序的大小。
  • 在.NET MAUI的测试中,通过调用JNI来获取Java数组元素的性能比使用string.Split和新的Span方法更差。这表明开发者正在考虑如何在未来版本中优化这一过程。
  • .NET 9在Android平台上对Native AOT的支持主要体现在通过新属性实现的功能开关,以及通过Native AOT减少应用大小的能力。

对于开发者而言,学习和采用.NET 9的Native AOT技术需要具备以下前置知识或技能:

  1. 对.NET平台的理解:首先,开发者需要对.NET平台有基本的了解,包括其架构、运行时环境以及如何在不同平台上部署应用。这有助于理解Native AOT技术如何与现有.NET生态系统集成。
  2. 熟悉C#或F#编程语言:由于.NET 9支持通过C#或F#进行开发,因此掌握这些编程语言是必要的。此外,了解这些语言的高级特性将有助于更有效地利用Native AOT带来的性能优势。
  3. 了解编译器原理:Native AOT(Native Application Optimized Translation)是一种预编译技术,它允许开发者直接生成机器码而不是依赖JIT(即时编译)。因此,对编译器的工作原理有一定的了解可以帮助开发者更好地理解和使用Native AOT技术[3]。
  4. 性能优化经验:由于Native AOT旨在提供可预测的性能并减少资源消耗,因此具备一定的性能优化经验是有益的。这包括对内存管理、代码优化等方面的深入了解。
  5. 云原生微服务架构知识:虽然不是必须的,但了解云原生应用和微服务架构的相关知识可以增强开发者在使用.NET 9时构建高效、可扩展的应用的能力。这是因为.NET 9特别强调了在这些架构中的性能表现,参见.NET 9 RC1发布[4]。

随着 .NET 的不断发展,我们可以期待更多的库和框架支持Native AOT,这使其成为希望优化其应用程序的开发人员更具吸引力的选择。那么为什么不试一试,看看你能在多大程度上提升你的应用的性能呢?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
.NET9 AOT部署
AOT是Ahead-of-Time的缩写,AOT是将C#程序提前编译为机器代码(通常为平台特定的二进制文件),在应用程序启动之前完成编译过程。
郑子铭
2025/03/17
1790
.NET9 AOT部署
简单介绍.NET
如果对.NET体系有基础了解的小伙伴可以直接划走,这里主要是分享一些刚学C#编程的小伙伴一些基础知识。刚接触C#或者.NET的小伙伴会对一对专业词汇根本不理解或者不清楚这些东西的作用和关系,例如:.NET Native , C# , .NET , CLR , JIT , IL , AOT等等词汇完全蒙圈的状态这里简单的介绍一下。
JusterZhu
2023/09/20
3320
简单介绍.NET
.NET平台系列7 .NET Core 体系结构详解
  .NET Core 是基于.NET Framework 为基础,借鉴了其优秀的思想与强大的功能,经过重新设计与构建,实现了.NET Framework 中的部分功能(不包含Windows UI部分),比如JIT、垃圾收集器(GC)、CLR、BCL等。
张传宁IT讲堂
2021/05/20
1.2K0
简析 .NET Core 构成体系
上图描述了 .NET Core的系统构成,最上层是应用层,是开发基于UI应用的框架集,包括了ASP.NET Core(用于创建web app),和 UWP(用于创建Windows10 app)。
莫问今朝
2019/02/25
8290
.NET 7.0/8.0 下 WinForm 的 AOT 尝试与实践
随着 .NET 的不断发展,AOT(Ahead-of-Time)编译逐渐成为提升应用性能和部署灵活性的关键技术。在 .NET 7.0 和 8.0 中,微软进一步优化了 Native AOT 的支持,使其能够应用于更多场景,包括传统的 Windows Forms(WinForm) 桌面应用。本文将探讨如何在 .NET 7.0/8.0 下为 WinForm 应用启用 AOT 编译,并分析其优势、挑战及实际应用案例。
郑子铭
2025/03/20
9540
.NET 7.0/8.0 下 WinForm 的 AOT 尝试与实践
UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化
微软(9 月 11 日)发布博文,微软正在预览对 .NET 9 的 UWP(通用 Windows 平台)支持,为现有 UWP 开发人员提供一条使用最新的 .NET 和本机 AOT 实现其应用程序现代化的途径。这样做是因为该公司敦促开发人员切换到 Windows App SDK 和 WinUI 3,可以让现有 UWP 开发者利用最新 .NET 和 Native AOT 来现代化改造其应用。
JusterZhu
2025/01/23
2370
UWP 通过 .NET 9 和Native AOT 的支持实现 UWP 应用的现代化
.NET NativeAOT 实现用户体验升级
TypedocConverter 是我先前因帮助维护 monaco-editor-uwp 但苦于 monaco editor 的 API 实在太多,手写 C# 的类型绑定十分不划算而发起的一个项目。
郑子铭
2023/11/24
4150
.NET NativeAOT 实现用户体验升级
终于开始了,微软的野心将通过全场景开发平台.NET 5体现得淋漓尽致!
现在都在谈论全场景开发,也就是用一套开发工具,可以开发包括但不限于桌面、移动、IOT、游戏、Web等平台的应用。这样对于开发人员是非常爽的。本文将介绍微软推出的开发平台:.net 5,这个开发平台将完美地满足我们的各种开发需求。.net 5也是.net家族的下一代产品。
蒙娜丽宁
2020/09/07
1.6K0
终于开始了,微软的野心将通过全场景开发平台.NET 5体现得淋漓尽致!
.NET 7 的 AOT 程序是否更容易破解?
随着 .NET 平台的不断演进,AOT(Ahead-of-Time Compilation,提前编译)在 .NET 7 中的引入,为开发者带来了显著的性能提升和应用启动速度的优化。然而,与传统的托管代码相比,AOT 程序是否更容易被逆向工程和破解,引发了业界的广泛关注。
Michel_Rolle
2024/12/10
2.4K0
Java Cloud Native 的未来 Graal AOT 编译器
Java 这门语言与生俱来的显著特性就是“一次编译,到处运行”,这种功能得益于 JVM 平台的支持,Java 程序通常通过将其打包为 JAR 或 WAR 包,并依赖 JVM 和 Servlet 容器来运行。其底层运行时 JVM 采用 JIT(即时编译)模式来执行程序代码,JVM 会在运行时进行编译优化和动态执行代码,这通常会导致较高的内存占用。这样的好处是采用 JIT 可以热更新和热部署程序,并且 JVM 可以在运行期间对程序进行动态分析,来实时优化程序以达到最好的性能状态。
一大块芝士
2024/07/23
2940
Java Cloud Native 的未来 Graal AOT 编译器
Spring 6.0已发布,AOT和Native Image成为新亮点
Spring Framework 6.0 上周末已经正式发布。接下来Spring的一系列项目都会以6.0为基准发布新版本,至此Spring家族正式进入6.0时代。Spring 6.0的基准线为Java 17、Jakarta EE 9和 Jakarta EE 10,你要尝鲜的话需要第一时间升级你的JDK。Spring 6.0还兼容了最新的Servlet Web容器 Tomcat 10.1、Jetty 11、 Undertow 2.3。
码农小胖哥
2023/01/30
9230
Spring 6.0已发布,AOT和Native Image成为新亮点
Unity3d:c#,Mono,IL2CPP,托管代码,AOT,JIT
通过C#编译器mcs,将C#编译为IL(中间语言,byte code) 通过Mono运行时中的编译器将IL编译成对应平台的原生码
立羽
2023/08/24
7380
Unity3d:c#,Mono,IL2CPP,托管代码,AOT,JIT
.NET周刊【9月第3期 2024-09-15】
https://www.cnblogs.com/thinkingmore/p/18406244
InCerry
2024/11/23
3230
.NET周刊【9月第3期 2024-09-15】
译 | .NET Core 3.0 Preview 6 已发布
今天,我们宣布 .NET Core 3.0 Preview 6。它的更新包括编译程序集以改进启动、使用链接器和 EventPipe 改进优化应用程序的大小。我们还在 ARM64 上发布了针对 Alpine 的新 Docker 镜像。
Edi Wang
2019/07/09
1.1K0
Spring Native beta 版发布, 技术融合越来越快
经过一年半的工作,我很高兴地宣布,Spring Native beta 版发布,并且可在 start.spring.io 中直接使用!
用户4172423
2021/04/02
1.7K0
Spring Native beta 版发布,  技术融合越来越快
好消息:NET 9 X86 AOT的突破 - 支持老旧Win7与XP环境
随着技术的不断进步,微软的.NET框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9版本中,一个特别引人注目的亮点是X86架构下的AOT( Ahead-of-Time)编译器的支持扩展,它允许开发人员将应用程序在编译阶段就优化为能够在老旧的Windows系统上运行,包括Windows 7和甚至Windows XP。这不仅提升了性能,也为那些依然依赖这些老平台的企业和个人开发者提供了新的可能性。
沙漠尽头的狼
2024/07/16
1.7K0
好消息:NET 9 X86 AOT的突破 - 支持老旧Win7与XP环境
Spring Boot3 新玩法,AOT 优化!
今天和小伙伴们来聊一聊 Spring6 中的一个新特性 AOT(Ahead of Time),这也是目前在学习 Spring6 源码视频的小伙伴的一个提问,其实还是挺有代表意义的,因此松哥整理一篇文章来和大家聊一聊这个话题。
江南一点雨
2024/01/17
2.7K1
Spring Boot3 新玩法,AOT 优化!
SpringBoot.3中的aot.factories到底有什么用?和以前的spring.factories一样吗?
首先,我们来澄清一下 aot.factories 和 spring.factories 之间的区别。这两个文件不仅名称不同,而且在功能上也存在显著差异。接下来,我们将深入探讨这两个文件的具体作用以及它们各自的应用场景。让我们一起来揭开它们的神秘面纱吧!
努力的小雨
2024/09/26
5720
进击的.NET 在云原生时代的蜕变
你一定看过这篇文章 《进击的 Java ,云原生时代的蜕变》, 本篇文章的灵感来自于这篇文章。北京时间9.24 就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Core。
AI.NET 极客圈
2019/09/26
7920
Announcing Spring Native Beta!
目前在start.spring.io上你已经可以看到它了。这个项目具有里程碑式的意义。它意味着目前除了自Spring成立以来受Spring支持的常规Java虚拟机之外, 还对通过GraalVM将Spring应用编译为原生镜像(Native Images)提供了Beta支持,这是一种部署Spring应用的新方式。
码农小胖哥
2021/03/19
6810
Announcing Spring Native Beta!
相关推荐
.NET9 AOT部署
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档