当前位置: 首页 > news >正文

.NET 8.0 本机 AOT

        在软件开发领域,优化性能和简化效率仍然至关重要。.NET 平台二十年来不断创新,为开发人员提供了构建弹性且高效的软件解决方案的基础架构。

        与本机 AOT提前编译相结合,取得了显着的进步。本文深入研究.NET Native AOT,揭示它的工作原理、优点以及它的各种应用场景。

什么是 .NET 本机 AOT?

        .NET 本机提前 (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 程序集框呈灰色的原因。

.NET 本机 AOT 的优点
.NET 本机提前 (AOT) 编译带来了一系列优势:

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

.NET Native AOT 的缺点
AOT 带来的好处不可避免地伴随着某些缺点。他们来了:

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

.NET 本机 AOT 实际应用
        使用 Visual Studio 创建 .NET 本机 AOT Web 应用程序,启动 Visual Studio 2022 v17.8(或更高版本)并选择从模板ASP.NET Core Web API(本机 AOT)创建项目。

        该模板为我们生成一个 .NET 8 ASP.NET Core Web API 应用程序,我们可以看到 .csproj 文件包含<PublishAot>true</PublishAot>。

编译 .NET Web 应用程序
        如果我们编译应用程序,我们可以看到在 .dll 下生成了一个 DLL 文件.\bin\debug\net8.0。此 DLL 是包含 IL 代码的常规 .NET 程序集。我们可以使用 ILSpy 对其进行反编译,如下图所示:

执行.NET Web应用程序
        此时,没有发生AOT编译。C# 代码在不到一秒的时间内就被编译为 IL 代码。.NET Web 应用程序可以按原样执行:

使用 .NET Native AOT 编译 Web 应用程序
        要使用 .NET Native AOT 编译 Web 应用程序,您必须dotnet publish 在包管理器控制台中键入:

        这次这个小应用程序的编译花费了 11 秒。我们获得一个大小为 9MB 的可执行文件。该文件无法使用 ILSpy 反编译,因为它不是 .NET 程序集。该文件仅包含本机代码。还生成一个 70MB PDB 文件,将本机代码与源代码链接起来以进行调试。

        可执行文件可以在任何 Windows x64 系统上按原样部署和执行。部署可以更简单吗?我不这么认为!

.NET 本机 AOT 权衡
现在是评估选项的时候了:

        1、一方面,我们在不到一秒的时间内生成了一个可在所有平台上运行的 40KB DLL。但它需要预安装.NET 8.0。
        2、另一方面,我们在 11 秒内编译出一个 9MB 的可执行文件。它可以在任何 Windows x64 系统上运行,无需任何先决条件。此外,这个本机版本的启动速度更快。对于任何足够复杂的 Web 应用程序,我们都可以期待更多的性能提升。
        人们可能会认为 9MB 比 40KB 大得多!但安装 .NET 8.0 需要的磁盘空间远多于 9MB。仅目录C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.0  就有 70MB,而且还有更多东西需要安装。因此 AOT 导致:

3、紧凑的容器镜像在容器化部署设置中特别有用
4、由于图像尺寸较小,部署时间缩短


以下是本文中值得引用的评论:

        这是怎样的前沿进步?在 .NET 平台引入之前的半个世纪里,这种软件的生产方式已经存在。
这是我的答案:因为你同时拥有了两个世界。

        1、一方面,与 C/C++ 相比,现代语言和平台通过运行时带来了许多便利
        2、另一方面,原始的本机可执行文件无需在生产计算机上安装平台。
        暂停一下,你就会意识到这个单一可执行文件有多酷。这 9MB 不仅包含 Web 应用程序代码。但它包含一些 CLR 代码(垃圾收集、库加载……)、常用的 .NET 类型(字符串、整数……)和 API 代码(如WebApplication.CreateSlimBuilder()【WebApplication.CreateSlimBuilder Method (Microsoft.AspNetCore.Builder) | Microsoft Learn】和 JSON 序列化器代码)。

        下面的依赖关系图(通过 NDepend 获得【Visual Studio - Explore existing .net code architecture】)显示了此 Web 应用程序代码及其依赖关系,全部打包在 9MB 位中!

用反射破坏.NET Native AOT?
        我努力尝试用 Reflection 来破坏 .NET Native AOT,但失败了。这是一个好消息,AOT 支持很多 Reflection API。以下是与 AOT 配合使用的代码:

// Reflection usage A
System.Type type = new object().GetType();
System.Reflection.MethodInfo methodInfo = type.GetMethod("ToString");
string str = (string)methodInfo.Invoke("Walk the dog", BindingFlags.Default, null, new object?[0], null);
Console.WriteLine("Reflection usage A:" + str);// Reflection usage B
var listOfString = typeof(List<>).MakeGenericType(new Type[] { typeof(string) });
var list = Activator.CreateInstance(listOfString) as List<string>;
list.Add("hello");
PropertyInfo prop = listOfString.GetProperty("Count");
int count = (int)prop.GetMethod.Invoke(list, new object?[0]);
Console.WriteLine("Reflection usage B:" + count);// Reflection usage C
Assembly assembly = Assembly.GetExecutingAssembly();
Type[] types = assembly.GetTypes();
foreach (Type type1 in types.Take(5)) {Console.WriteLine("Reflection usage C:" + type1.FullName);
}// Reflection usage D
Type unknownType = Type.GetType("System.String");
ParameterExpression param = Expression.Parameter(unknownType, "x");
MethodInfo method = unknownType.GetMethod("ToLower", Type.EmptyTypes);
Expression call = Expression.Call(param, method);
var lambda = Expression.Lambda(call, param).Compile();
var result = lambda.DynamicInvoke("HELLO");
Console.WriteLine("Reflection usage D:" + result);

        我们dotnet publish有时会收到一些警告,但它确实有效!

.NET 8 对本机 AOT 的支持
支持这些

1、Middleware 中间件
2、Minimal APIs 最小 API
3、gRPC 远程过程调用
4、Kestrel HTTP Server
5、Authorization 授权
6、JWT Authentication 认证
7、CORS 跨域资源共享
8、HealthChecks 健康检查
9、OutputCaching 输出缓存
10、RequestDecompression 请求解压
11、ResponseCaching 响应缓存
12、ResponseCompression 响应压缩
13、StaticFiles 静态文件
14、WebSockets
15、ADO.NET
16、PostgreSQL
17、Dapper AOT
18、SQLite

尚不支持这些

1、ASP.NET Core MVC
2、WebAPI
3、SignalR
4、Blazor Server,
5、Razor Pages,
6、Session, Spa
7、Entity Framework Core


结论
        .NET Native AOT 代表了优化 .NET 应用程序的关键一步。这种编译为本机代码的过程可以最大限度地减少运行时对即时 (JIT) 编译的依赖,从而提高性能。由此带来的好处包括更快的执行速度、减少的部署开销以及提高可扩展性的潜力,使其成为提高 .NET 开发领域效率和性能的绝佳选择。

        借助 .NET 8,Native AOT 已经相当成熟,可以在生产中使用。我们当然可以希望微软能够继续改进AOT支持。

相关文章:

.NET 8.0 本机 AOT

在软件开发领域&#xff0c;优化性能和简化效率仍然至关重要。.NET 平台二十年来不断创新&#xff0c;为开发人员提供了构建弹性且高效的软件解决方案的基础架构。 与本机 AOT&#xff08;提前&#xff09;编译相结合&#xff0c;取得了显着的进步。本文深入研究.NET Native AO…...

phpcms v9未审核推荐信息出现在推荐列表中【BUG修复】

修改文件&#xff1a;phpcms/modules/content/class/content_tag.class.php 调整过的方法&#xff1a; public function __construct() {$this->db pc_base::load_model(content_model);$this->position pc_base::load_model(position_model);$this->position_da…...

Linux第20步_在虚拟机上安装“Visual Studio Code”

1、双击windows系统桌面上的“FileZilla Client.exe”&#xff0c;打开FTP客户端&#xff0c;点击03软件下的Visual Studio Code&#xff0c;发现code_1.50.1-1602600906_amd64。 2、点击“文件”&#xff0c;然后点击“站点管理器”&#xff0c;见下图操作&#xff1a; 3、点…...

【服务器数据恢复】Raid5热备盘同步失败导致lvm结构损坏的数据恢复案例

服务器数据恢复环境&#xff1a; 两组由4块磁盘组建的raid5磁盘阵列&#xff0c;两组raid5阵列划分为lun并组成了lvm结构&#xff0c;ext3文件系统。 服务器故障&#xff1a; 一组raid5阵列中的一块硬盘离线&#xff0c;热备盘自动上线并开始同步数据。在热备盘完成同步之前&am…...

react+AntDesign 之 pc端项目案例

1.环境搭建以及初始化目录 CRA是一个底层基于webpack快速创建React项目的脚手架工具 # 使用npx创建项目 npx create-react-app react-jike# 进入到项 cd react-jike# 启动项目 npm start2.安装SCSS SASS 是一种预编译的 CSS&#xff0c;支持一些比较高级的语法&#xff0c;…...

实验笔记之——基于COLMAP的Instant-NGP与3D Gaussian Splatting的对比

之前博客进行了COLMAP在服务器下的测试 实验笔记之——Linux实现COLMAP-CSDN博客文章浏览阅读794次&#xff0c;点赞24次&#xff0c;收藏6次。学习笔记之——NeRF SLAM&#xff08;基于神经辐射场的SLAM&#xff09;-CSDN博客NeRF 所做的任务是 Novel View Synthesis&#xf…...

实战环境搭建-linux下安装悟空CRM

下载地址如下: 链接:https://pan.baidu.com/s/1OI9EA8Nc8ymWlERS9i0vjg?pwd=ws5c 提取码:ws5c 上传crm的程序包,如下图: 输入 unzip 72crm-java-master.zip 进行解压 create database crm9; use crm9; source /opt/72crm-java-master/docs/crm9.sql 修改/home/wukongcr…...

Redis 7.0性能大揭秘:如何优化缓存命中率?

Redis 7.0&#xff0c;这货不仅仅是一个简单的缓存工具&#xff0c;它更是一款高性能的数据结构服务器。现在&#xff0c;大家都知道缓存命中率对性能影响特别大&#xff0c;但怎么优化它呢&#xff1f; 本文&#xff0c;已收录于&#xff0c;我的技术网站 ddkk.com&#xff0…...

【深度学习每日小知识】Data Augmentation 数据增强

数据增强是通过对原始数据进行各种转换和修改来人工生成附加数据的过程&#xff0c;旨在增加机器学习模型中训练数据的大小和多样性。这对于计算机视觉领域尤为重要&#xff0c;因为图像经常被用作输入数据。 计算机视觉中的数据增强 数据增强的主要目标是解决过拟合问题&…...

网络调试 UDP1,开发板用动态地址-入门6

https://www.bilibili.com/video/BV1zx411d7eC?p11&vd_source109fb20ee1f39e5212cd7a443a0286c5 1, 开发板连接路由器 1.1&#xff0c;烧录无OS UDP例程 1.2&#xff0c;Mini USB连接电脑 1.3&#xff0c;开发板LAN接口连接路由器 2. Ping开发板与电脑之间通信* 2.1 根据…...

【Gin实战教程】快速入门

Gin是一个轻量级的Web框架&#xff0c;使用Go语言开发。它具有高性能、易用性和灵活性的特点&#xff0c;是构建可扩展的Web应用程序的理想选择。 首先&#xff0c;Gin是一个高性能的框架。它基于Go语言的原生HTTP包进行开发&#xff0c;利用了Go语言的并发特性和协程模型&…...

WPF真入门教程26--项目案例--欧姆龙PLC通讯工具

1、案例介绍 前面已经完成了25篇的文章介绍&#xff0c;概括起来就是从0开始&#xff0c;一步步熟悉了wpf的概念&#xff0c;UI布局控件&#xff0c;资源样式文件的使用&#xff0c;MVVM模式介绍&#xff0c;命令Command等内容&#xff0c;这节来完成一个实际的项目开发&#…...

C++ OpenGL 3D Game Tutorial 2: Making OpenGL 3D Engine学习笔记

视频地址https://www.youtube.com/watch?vPH5kH8h82L8&listPLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzg&index3 一、main类 接上一篇内容&#xff0c;main.cpp的内容增加了一些代码&#xff0c;显得严谨一些&#xff1a; #include<OGL3D/Game/OGame.h> #include<i…...

Redis小计(4)

目录 1.Set和Get操作 2.mset和mget 3.mset&#xff0c;mget&#xff0c;set后加参数的优点 4.incr,incrby&#xff0c;incrbyfloat 1.Set和Get操作 flushall&#xff1a;清除所有k-v键值对。&#xff08;删库跑路小技巧&#xff09; set k v[ex | px]&#xff1a;设置超时…...

【React】常用Hook函数的梳理和总结(第二篇)

1. 前言 本篇梳理和总结React中常用的Hook函数。 欢迎大家来到Hook的世界&#xff0c;真的贼好用~ 2. 常用Hook函数 Hook说明示例useState(initialState) 功能&#xff1a;为函数组件添加状态变量&#xff0c;输入可是基本数据类型或引用数据类型&#xff0c;也可以是不带参数…...

【JaveWeb教程】(15) SpringBootWeb之 响应 详细代码示例讲解

目录 SpringBootWeb请求响应2. 响应2.1 ResponseBody2.2 统一响应结果2.3 案例2.3.1 需求说明2.3.2 准备工作2.3.3 实现步骤2.3.4 代码实现2.3.5 测试2.3.6 问题分析 SpringBootWeb请求响应 2. 响应 前面我们学习过HTTL协议的交互方式&#xff1a;请求响应模式&#xff08;有…...

「 PyMuPDF专栏 」PyMuPDF为PDF文件添加注释

文章目录 一、PyMuPDF的安装与基本使用1. 安装PyMuPDF库的方法2. 导入PyMuPDF库二、新建PDF文档1. 创建一个空白的PDF文档三、添加注释1. 导入库并打开PDF文件2. 选择要添加注释的页面3. 创建并添加注释3.1. 文本注释3.1.1. 完整代码3.1.2. 注释效果图3.2. 高亮注释3.2.1. 完整…...

5 - 视图|存储过程

视图&#xff5c;存储过程 视图视图基本使用使用视图视图进阶 存储过程创建存储过程存储过程进阶存储过程参数循环结构 视图 视图是虚拟存在的表 表头下的数据在真表里 表头下的数据存储在创建视图时 在select命令访问的真表里 优点&#xff1a; 安全数据独立简单 用户无需关…...

系统学习Python——警告信息的控制模块warnings:警告过滤器-[基础知识]

分类目录&#xff1a;《系统学习Python》总目录 警告过滤器控制着警告是否被忽略、显示或转为错误&#xff08;触发异常&#xff09;。 从概念上讲&#xff0c;警告过滤器维护着一个经过排序的过滤器类别列表&#xff1b;任何具体的警告都会依次与列表中的每种过滤器进行匹配&…...

vue中高德地图使用

1、安装 npm i amap/amap-jsapi-loader --save2、封装地图组件 <template><div id"map" ref"mapcontainer"></div> </template><script> import AMapLoader from "amap/amap-jsapi-loader"; export default {befo…...

算法训练营Day33

#Java #贪心 开源学习资料 Feeling and experiences&#xff1a; 单调递增的数字&#xff1a;力扣题目链接 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&am…...

.net6解除文件上传限制。Multipart body length limit 16384 exceeded

在C#中上传文件时如果不修改默认文件的上传大小会提示Multipart body length limit 16384 exceeded这个错误提示表明你的请求中的Multipart body长度超过了16384字节的限制。这通常意味着你正在尝试发送一个太大的请求体&#xff0c;可能是因为包含了太多数据或者太大的文件。要…...

电子电器架构网络演化 —— 车载以太网TSN

电子电器架构网络演化 —— 车载以太网TSN 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消…...

智能门锁触控工作原理中应用的电容式触摸芯片

智能门锁的识别技术中&#xff0c;密码几乎成为标配功能。相比机械按键的触控方式&#xff0c;电容式触控方式可以在加上一层玻璃甚至金属一体成型之后与用户进行交互&#xff0c;由于进行了物理性隔离&#xff0c;使得外壳更具完整性&#xff0c;物理上安全性更佳。电容式触控…...

Spark 中 BroadCast 导致的内存溢出(SparkFatalException)

背景 本文基于 Spark 3.1.1 open-jdk-1.8.0.352目前在排查 Spark 任务的时候&#xff0c;遇到了一个很奇怪的问题&#xff0c;在此记录一下。 现象描述 一个 Spark Application, Driver端的内存为 5GB,一直以来都是能正常调度运行&#xff0c;突然有一天&#xff0c;报…...

深度学习经典算法详细模型图

很早绘制的一些模型图&#xff0c;当时放在CSDN的草稿里&#xff0c;今天发现了&#xff0c;把它分享出来吧&#xff0c;还能更清晰的帮助理解&#xff01; 1.AlexNet(2012) 2. VGGNet(2014) 3. SqueezeNet(2016) 4. GoogleNet(2014)...

03、Kafka ------ CMAK(Kafka 图形界面管理工具) 下载、安装、启动

目录 CMAK&#xff08;Kafka 图形界面管理工具&#xff09;下载安装启动打开 cmak 图形界面 CMAK&#xff08;Kafka 图形界面管理工具&#xff09; Kafka本身并没有提供Web管理工具&#xff0c;而是推荐使用bin目录下各种工具命令来管理Kafka&#xff0c; 这些工具命令其实用起…...

复习python从入门到实践——函数function

复习python从入门到实践——函数function 函数是特别难的&#xff0c;大家一定要好好学、好好复习、反复巩固。函数没学好&#xff0c;会为后面造成很大困扰。 教科书中函数举例会稍微有点复杂。在此章复习中&#xff0c;我将整理出容易疏漏和混淆的知识点&#xff0c;并用最简…...

【Internal Server Error】pycharm解决关闭flask端口依然占用问题

Internal Server Error The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application. 起因&#xff1a; 我们在运行flask后&#xff0c;断开服务依然保持运行&#xff0…...

torch.nn.functional.interpolate与torchvision.transforms.Resize方法对张量图像Resize应用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、非张量数据使用torch方法resize(transforms.Resize)二、张量数据使用torch方法resize(torch.nn.functional.interpolate) 前言 要使用 PyTorch 对张量进行…...

请问番禺哪里有做网站的/seo优化seo外包

题目&#xff1a; 请实现一个函数&#xff0c;输入一个整数&#xff0c;输出该数二进制表示中1的个数。例如把9表示成二进制是1001&#xff0c;有2位是1.因此如果输入9&#xff0c;该函数输出2. 方法一&#xff1a; 注意&#xff1a;整数和负数以及0的区别&#xff0c;这是由存…...

企业网站带手机源码/竞价什么意思

1.mysql安装 full安装 2.SQLyog安装 mysql的图形界面&#xff0c;安装后新建连接&#xff0c;输入密码可自动检测到mysql数据库 3.导入示例数据库 http://www.yiibai.com/downloads/yiibaidb.zip 将sql文件解压出来 新建数据库 create database if not exist yiibaidb; 使用数据…...

动态网站建设选择题/推广营销策划方案

转载&#xff1a;https://www.cnblogs.com/1ming/p/5227944.html1、 JAVA中值类型和引用类型的不同&#xff1f;[定义]引用类型表示你操作的数据是同一个&#xff0c;也就是说当你传一个参数给另一个方法时&#xff0c;你在另一个方法中改变这个变量的值&#xff0c;那么调用这…...

建设营销型网站制作/seo快速排名优化

点击上方蓝色字体&#xff0c;选择“标星公众号”优质文章&#xff0c;第一时间送达关注公众号后台回复pay或mall获取实战项目资料视频年初送15.6英寸笔记本电脑&#xff0c;吃鸡超级爽&#xff0c;不爱可折现&#xff01;&#xff01;作者&#xff1a;梅西爱骑车来源&#xff…...

网站制作里面链接怎么做/搜索网页内容

SQL Server 2005 如何自动备份数据库 具体步骤如下&#xff1a;一、开始菜单中打开SQL Server Management Studio&#xff0c;展开窗口左边的SQL服务器&#xff1b; 二、SQL Server代理&#xff0c;右键选择"启动"&#xff08;未启动的话&#xff09;&#xff1b; &a…...

网站制作课程多少钱/武汉seo楚天

2017全国计算机二级VB考试操作题与答案二、简单应用题(1)【考点分析】本题考点有&#xff1a;命令按钮的Caption和Name属性&#xff0c;下拉式组合框的Caption、Name、List和ListCount属性&#xff0c;文本框的Text和Name属性&#xff0c;标签的Caption和Name属性&#xff0c;下…...