使用AOT编译时,千万别图省事用dotnet build——它只是编译,不是发布。必须走dotnet publish,还得带上运行时标识符(-r RID)和--self-contained true,以及/p:PublishAot=true。项目的SDK必须是Microsoft.NET.Sdk,隐式框架引用统统关掉;所有依赖包,像JSON序列化、HTTP客户端、数据库驱动,都得是8.0及以上版本,并且明确支持AOT。

C#怎么创建AOT原生编译_C# Native AOT发布部署方法教程【高级

直接敲dotnet build想生成AOT二进制?别想了。Native AOT本质上是发布阶段的行为,得用dotnet publish,并且显式指定RID。不指定的话,编译要么静默失败,要么直接甩你一句“The RuntimeIdentifier must be set for native AOT publish.”

必须用 Microsoft.NET.Sdk 基础 SDK,禁用所有隐式框架引用

AOT对SDK有严格要求:那些带宿主逻辑的SDK,比如Microsoft.NET.Sdk.WebMicrosoft.NET.Sdk.Worker,统统不支持。哪怕你写的是控制台程序,只要.csproj文件开头不是,那么--aotPublishAot参数就会被无视。

dotnet publish 命令必须带 -r--self-contained

AOT编译的本质是跨平台原生代码生成,不指定RID,构建系统根本不知道目标架构,直接就中断了。别想着用any或者干脆省略——win-x64linux-x64osx-arm64这些必须写全。

JSON 序列化和 HttpClient 必须提前“声明存在”

AOT的静态分析有个硬伤:它无法推导运行时才决定的类型名或方法签名。System.Text.Json默认走反射序列化路径,这条路径会被整段裁剪掉;HttpClient的构造器也可能被移除,运行时报MissingMethodException是常有的事。

真正让人头疼的,不是写对第一行命令,而是所有第三方依赖都得过一遍AOT兼容性筛子。拿Newtonsoft.Json来说,即使升级到13.0.3,某些动态场景照样会崩。DI容器里注册的服务,如果用了表达式树或Activator.CreateInstance,也会在运行时突然消失。这些坑在编译时一声不吭,只会在目标机器上静默失败。

本文转载于:https://www.php.cn/faq/2344195.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。