用途:让 .NET 项目兼容 Native AOT 与 IL 裁剪,系统化消除 IL 裁剪/AOT 分析器警告。适用于“让项目支持 AOT”“修复裁剪警告”“解决 IL2070/IL2067/IL2072/IL2026/IL3050”“添加 DynamicallyAccessedMembers 注解”“在 .csproj 启用 IsAotCompatible”等场景;不适用于仅面向 .NET Framework(net4x)的项目。前提:已有面向 net8.0 或更高版本(或含 net8.0+ TFM)的项目及对应 SDK。
主要能力:启用并利用 AOT/裁剪分析器定位问题,按警告代码分诊,给出注释与重构修复配方,包括 DynamicallyAccessedMembers 注解、修复注解流(如避免把 Type 装箱进 object[])、源生成 JSON 序列化批量修复,以及作为最后手段使用 RequiresUnreferencedCode / RequiresDynamicCode。明确禁止用 #pragma warning disable 或 UnconditionalSuppressMessage 隐藏 IL 警告。
使用方式:在 .csproj 添加 IsAotCompatible,多目标框架时加条件:<IsAotCompatible Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0'))">true</IsAotCompatible>。随后构建并收集警告:dotnet build <project.csproj> -f <net8.0-or-later-tfm> --no-incremental 2>&1 | grep 'IL[0-9]{4}'。按警告代码分组计数,优先处理占比最高的模式(常见为 JsonSerializer 引发的 IL2026/IL3050,可创建 JsonSerializerContext 并批量替换调用点);从最内层反射调用向外修复,每修 5-10 条即重新构建,最后构建所有 TFM 验证:dotnet build <project.csproj>。
限制与注意:不分析整个代码库、不阅读架构文档,只按编译器警告指向的文件和行处理;不要用 sed 修改 C# 代码;第三方依赖中无法修改的警告只记录不追;若需架构级重写(如替换整个序列化层)应记录后停止;每条警告最多 3 轮构建修复,否则升级为 RequiresUnreferencedCode。面向 netstandard2.0/net472 的多目标项目需提供 DynamicallyAccessedMembersAttribute 等 polyfill。外部类型若无源生成序列化,可检查 IJsonModel<T> 或编写自定义 JsonConverter<T>;Newtonsoft.Json、XmlSerializer 等反射型序列化器通常不兼容 AOT。共享项目中添加的注解会影响所有引用项目。