ReadyToRun(简称R2R)是.NET平台提供的预编译优化技术,它可以在应用程序发布阶段,将程序集的中间语言(IL)预先编译为目标平台的原生机器码,避免程序运行时由JIT(即时编译器)进行编译的开销,从而显著提升应用的启动速度和部分场景下的运行性能。

ReadyToRun的核心工作原理
传统的.NET程序发布后包含IL代码,运行时CLR会加载这些IL,通过JIT编译器将其编译为对应CPU架构的原生代码才能执行,这个过程会消耗一定的时间和CPU资源,尤其是程序启动阶段需要编译大量代码时,启动延迟会比较明显。
而启用R2R预编译后,发布过程会直接完成IL到原生代码的编译工作,生成的程序集会同时包含原生代码和原始的IL代码(作为后备,防止预编译的原生代码不适用当前运行环境)。当程序运行时,CLR会优先使用预编译好的原生代码,跳过JIT编译步骤,从而减少启动时间和运行初期的性能损耗。
启用R2R预编译的配置方式
使用项目文件配置
在.NET Core 3.0及以上版本的项目中,可以直接修改项目的.csproj文件来启用R2R预编译,核心配置项是PublishReadyToRun,设置为true即可开启。
如果只需要针对特定平台发布R2R编译的程序,还需要配合RuntimeIdentifier指定目标运行时标识符,比如要发布Windows 64位版本的程序,可以配置如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<!-- 启用ReadyToRun预编译 -->
<PublishReadyToRun>true</PublishReadyToRun>
<!-- 指定目标运行时,这里以Windows x64为例 -->
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
</Project>
使用命令行发布配置
如果不想修改项目文件,也可以在发布命令中直接指定R2R相关的参数,使用dotnet publish命令时添加/p:PublishReadyToRun=true参数即可,示例如下:
# 发布Windows x64平台的R2R预编译程序 dotnet publish -c Release -r win-x64 /p:PublishReadyToRun=true
R2R预编译的注意事项
- R2R预编译是平台相关的,预编译的原生代码只能运行在指定的目标平台上,因此发布时需要明确指定
RuntimeIdentifier,不能发布为可移植的版本。 - 启用R2R会增大发布后的程序体积,因为程序集会同时包含原生代码和IL代码,通常体积会增加20%到50%左右,需要根据存储和性能需求权衡。
- 对于部分动态生成代码较多的场景,R2R的优化效果会打折扣,因为动态生成的代码仍然需要JIT编译,无法提前预编译。
- 如果目标环境支持,也可以同时启用
PublishReadyToRunComposite配置,将多个程序集的R2R代码合并,进一步提升启动性能,该配置同样设置为true即可。
验证R2R预编译是否生效
可以通过检查发布后的程序集来确认R2R是否生效,使用dotnet tool安装dotnet-ready-to-run工具,然后扫描发布的目录:
# 安装工具 dotnet tool install -g dotnet-ready-to-run # 扫描发布目录,查看R2R状态 dotnet ready-to-run path/to/publish/directory
如果工具输出显示程序集包含R2R原生代码,说明预编译已经成功生效。
适用场景说明
R2R预编译最适合启动速度敏感的桌面应用、命令行工具、云函数等场景,对于长时间运行的服务端应用,由于JIT编译只会发生一次,后续的代码执行不会再产生编译开销,因此R2R的优化效果相对有限,可以根据实际情况选择是否启用。
ReadyToRunR2R预编译CSharp程序优化修改时间:2026-07-08 01:27:23