.NET8中使用AOT编译模式
很惭愧,直到.NET9发布才知道有这么一个功能,一番搜索下发现在.NET7中就已经支持这个特性了,今天就在本地的.NET8环境下测试一下这个功能吧
首先新建一个项目



如果没有勾选,或者是老项目也没有关系,我们右键项目,点击编辑项目文件,手动加入这一行

接下来我们创建一个类随便写一个方法即可
1 public static string Traditional() 2 { 3 string Sample = Console.ReadLine() ?? "Hello, World! This is a test string."; 4 return Sample.Substring(7, 5); 5 }
然后在Program.cs中调用这个方法
1 using ConsoleApp; 2 3 性能测试.Traditional();
然后点击发布

哦侯,就报错了,AOT和单文件只能二选一

那我们取消掉生成单个文件再发布一下

还是报错,我们勾选上C++的桌面开发,然后安装试试

安装完之后我们再来重新发布,一次过

可以运行一下EXE文件,看到占用内存变小了,单纯只是不同编译模式的情况下少了几百KB,而且文件也少,它还可以单独运行,不依赖任何文件和环境
然后我又用JIT编译发布了一份文件,对比一下运行占用内存和文件数量


这里是JIT发布模式,一模一样的情况下,没有改任何代码,文件有几百个,只能和其他文件在同一目录下运行


可见确实改善非常大,好了,简单的实操就是这样,接下来可以看一下理论知识
优点:
1. AOT 会生成一个自包含的应用程序,并且已提前 (AOT) 编译为本机代码。原生 AOT 应用程序具有更快的启动时间和更小的内存占用,因为代码已经预先编译成了本地机器码,减少了启动时的编译开销,这些应用可以在未安装 .NET 运行时的计算机上运行
2. 在某些情况下,AOT 编译可以优化应用程序的运行时性能。由于代码在发布前已经进行了优化编译,减少了运行时动态编译可能带来的性能波动。
3. 对于一些不支持 JIT 编译的环境(例如某些嵌入式系统或具有严格安全限制的环境),AOT 编译使得.NET 应用程序能够在这些环境中运行
4. 在开发过程中,如果已经确定了应用程序的主要运行场景,AOT 编译可以帮助提前发现一些潜在的性能问题和代码错误,因为编译过程会对代码进行严格的检查
5. 增加了反编译的难度,一般情况下是反编译不出来的,代码再也不用裸奔了
优点说完了,我们说说缺点:
1. 如果应用程序在运行时存在大量动态加载的类型或方法(例如通过反射加载),AOT 编译可能会导致这些动态特性的性能下降。因为 AOT 编译主要针对静态已知的代码,动态加载的部分可能需要额外的处理机制
2. AOT 编译会将程序代码全部编译成目标机器码,这会导致发布文件的大小显著增加。因为除了应用程序本身的代码外,还包含了所有依赖库的预编译代码
3. AOT 编译过程相对复杂,需要对整个应用程序的代码进行提前编译和优化,这会导致构建时间明显延长。对于大型项目或者频繁构建的开发场景,较长的构建时间会降低开发效率,增加等待时间
4. 与 JIT 编译相比,AOT 编译后的代码在调试时会遇到更多困难。因为代码已经预编译成机器码,调试工具可能无法像在 JIT 编译环境下那样方便地提供源代码级别的调试信息。这使得查找和解决代码中的问题(如运行时错误、逻辑错误)变得更加复杂
在.NET8平台下还不支持32位系统编译
| Platform | Supported architecture | Notes |
|---|---|---|
| Windows | x64, Arm64 | |
| Linux | x64, Arm64 | |
| macOS | x64, Arm64 | |
| iOS | Arm64 | Experimental support |
| iOSSimulator | x64, Arm64 | Experimental support |
| tvOS | Arm64 | Experimental support |
| tvOSSimulator | x64, Arm64 | Experimental support |
| MacCatalyst | x64, Arm64 | Experimental support |
| Android | x64, Arm64 | Experimental, no built-in Java interop |
在最新的.NET9中已经支持32位系统编译了,而且很多地方做的很不错了,大家可以尝试一下
| Platform | Supported architecture | Notes |
|---|---|---|
| Windows | x64, Arm64, x86 | |
| Linux | x64, Arm64, Arm | |
| macOS | x64, Arm64 | |
| iOS | Arm64 | |
| iOSSimulator | x64, Arm64 | |
| tvOS | Arm64 | |
| tvOSSimulator | x64, Arm64 | |
| MacCatalyst | x64, Arm64 | |
| Android | x64, Arm64, Arm | Experimental, no built-in Java interop |

浙公网安备 33010602011771号