0

0

C# Native AOT编译方法 C#如何将应用编译为本机代码

畫卷琴夢

畫卷琴夢

发布时间:2026-02-02 12:10:03

|

330人浏览过

|

来源于php中文网

原创

Native AOT 编译要求.NET 7+、Microsoft.NET.Sdk基础SDK、显式指定RuntimeIdentifier,禁用隐式框架引用和反射,需适配AOT友好的NuGet包及配置。

c# native aot编译方法 c#如何将应用编译为本机代码

Native AOT 编译需要 .NET 7+ 且项目 SDK 必须为 Microsoft.NET.Sdk

低于 .NET 7 的版本不支持 Native AOT;即使装了高版本 SDK,若项目文件仍用 Microsoft.NET.Sdk.WebMicrosoft.NET.Sdk.Workerdotnet publish 会直接忽略 --aot 参数或报错“PublishAot is not supported”。必须显式改用基础 SDK,并手动处理宿主逻辑(比如 Web 项目要自己调用 WebApplication.CreateBuilder,不能依赖模板自动生成的宿主)。

  • 检查项目文件开头是否为
  • 移除 等隐式框架引用,改用 NuGet 包(如 Microsoft.AspNetCore.App.Ref)并确认其支持 AOT
  • 避免使用反射动态加载程序集(Assembly.LoadFrom)、System.Text.Json 的未标注序列化器、未提前注册的 DI 服务——这些在 AOT 下会静默失败或运行时报 MissingMethodException

dotnet publish 必须指定 --aot-r(RuntimeIdentifier)

AOT 编译不是编译开关,而是发布阶段的跨平台原生代码生成行为,不指定 -r 会导致构建失败:“The RuntimeIdentifier must be set for native AOT publish.”。目标平台决定生成的二进制格式(如 win-x64linux-x64osx-arm64),且不能用 any 或省略。

  • 正确命令示例:dotnet publish -c Release -r win-x64 --aot
  • 若需调试符号,加 --strip-symbols false(默认开启 strip,导致 pdb 不可用)
  • Windows 上若提示 “LLVM not found”,需安装 llvm 并确保 clang++ 在 PATH 中;Linux/macOS 同理,AOT 依赖系统级 C++ 工具

第三方库必须声明 AotCompatibility 或提供 AOT 友好 API

很多 NuGet 包(尤其是含反射、表达式树、动态代码生成的)默认不兼容 AOT。.NET SDK 会在 publish 时扫描引用并报错,例如:ILLink failed: Unresolved assembly 'Newtonsoft.Json'。不是所有包都已适配——比如旧版 Newtonsoft.Json 不支持,必须升级到 13.0.3+ 并启用 JsonSerializerOptions.AotCompilation(部分场景仍需替换为 System.Text.Json)。

有道翻译AI助手
有道翻译AI助手

有道翻译提供即时免费的中文、英语、日语、韩语、法语、德语、俄语、西班牙语、葡萄牙语、越南语、印尼语、意大利语、荷兰语、泰语全文翻译、网页翻译、文档翻译、PDF翻

下载
  • 优先选用标有 truetrue 的包(可在 .nuspec 或源码仓库中查)
  • 数据库驱动如 Npgsql 需 8.0+,Microsoft.Data.Sqlite 需 8.0+,否则连接字符串解析等环节会因反射失败
  • 日志、配置、验证等基础功能尽量用 Microsoft.Extensions.* 8.0+ 版本,避免自行封装泛型工厂或未标注 [RequiresUnreferencedCode] 的扩展方法

调试和体积优化的实际取舍点

AOT 输出是单文件原生可执行文件,无运行时依赖,但启动快 ≠ 全局快:JIT 的运行时优化(如内联热点方法、PGO)在 AOT 中不可用,某些计算密集型路径可能变慢。同时,关闭 trim(none)会让体积暴涨 2–5 倍,而过度 trim 又易引发 MissingFieldException

  • 开发期用 dotnet run -c Debug --no-build --aot 快速验证基本流程(仅限支持的平台)
  • 发布前务必开启 trim:partial(默认)或 link,并配合 true
  • 若遇到运行时报“method not found”,先检查是否漏加 [DynamicDependency][UnconditionalSuppressMessage],再用 dotnet publish --no-restore -bl 查看 ILLink 日志定位裁剪点
AOT 编译真正难的不是命令敲对,而是把整个应用的反射、动态类型、配置绑定、序列化路径全部显式收口——稍有遗漏,错误就藏在运行时,且堆不友好。建议从小型控制台工具开始试,别一上来就压 Web API。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

424

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

537

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1505

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

8

2026.02.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.3万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号