.NET Native AOT 配置与极端体积优化指南

注: 微软官方从 .NET 7 开始正式引入并支持 Native AOT 编译。因此,本文档介绍的所有基础配置均默认要求目标框架至少为 .NET 7。对于部分在后续版本中新增的配置,已在对应标题后方直接标注(如 .NET 8+.NET 10+)。

因 .NET Native AOT(Ahead-of-Time)编译会将底层的 .NET 运行时(Runtime)、垃圾回收机制(GC)以及所有依赖的框架基础类库(BCL)都静态编译到单一的平台原生可执行文件中,所以编译出的基础二进制文件体积通常比较大。

尽管 AOT 显著降低了应用的启动时间与运行时内存占用,但为了解决打包体积过大的问题,底层的 IL 编译器(ILCompiler)与代码裁剪器(Trimmer)起着决定性作用。通过在 .csproj 中深度微调这些编译参数,我们可以精准剔除不需要的框架子系统(如全球化、反射、网络库等),将最终生成的二进制文件压缩到极致。


1. 核心 AOT 与编译模式

PublishAot

IsAotCompatible

PublishTrimmed

TrimMode

OptimizationPreference (.NET 8+)


2. 编译器底层控制 (ILC 配置)

IlcInstructionSet

IlcDisableReflection

IlcScanReflection

IlcGenerateStackTraceData

IlcGenerateCompleteTypeMetadata

ControlFlowGuard


3. 基础类库 (BCL) 特性裁剪

按需剔除 .NET 底层的大型子系统,是缩减体积最有效的方法。以下多数支持属性设为 false 时,可通过移除相关代码来实现极致的体积缩减。

全球化与本地化

InvariantGlobalization

HybridGlobalization (.NET 8+)

诊断、监控与调试

DebuggerSupport

EventSourceSupport

MetricsSupport

HttpActivityPropagationSupport

StackTraceSupport (.NET 8+)

核心算法与数据结构

UseSizeOptimizedLinq (.NET 10+)

UseSystemResourceKeys (.NET 8+)

网络与 XML

Http3Support (.NET 10+)

UseNativeHttpHandler

XmlResolverIsNetworkingEnabledByDefault

遗留系统与特殊互操作

BuiltInComInteropSupport

EnableUnsafeUTF7Encoding

EnableUnsafeBinaryFormatterSerialization

StartupHookSupport

MetadataUpdaterSupport

AutoreleasePoolSupport (.NET 8+)


4. 裁剪行为干预与警告控制

IsTrimmable

TrimmerRootAssembly

TrimmerRootDescriptor

SuppressTrimAnalysisWarnings

TrimmerSingleWarn


5. 调试符号与体积剥离 (Stripping)

DebugSymbols

DebugType

TrimmerRemoveSymbols

StripSymbols


6. 原生互操作 (C-ABI 导出)

NativeLib

CustomNativeMain


7. 终极实战:极致体积优化模板

以下配置模板启用了绝大部分的缩减指令。应用此模板可将基础的控制台或 Web API 应用压缩至几 MB 级别。

说明:此配置禁用了反射、全球化和详细异常追踪,部署前需经过严格的运行时测试。

xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <!-- AOT 必须指定目标运行时架构 -->
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>

    <!-- 1. 核心 AOT 与编译器偏好 -->
    <PublishAot>true</PublishAot>
    <IsAotCompatible>true</IsAotCompatible>
    <OptimizationPreference>Size</OptimizationPreference>

    <!-- 2. ILC 编译器级暴力裁剪 -->
    <IlcGenerateStackTraceData>false</IlcGenerateStackTraceData>
    <IlcGenerateCompleteTypeMetadata>false</IlcGenerateCompleteTypeMetadata>
    <IlcScanReflection>false</IlcScanReflection>
    <!-- 若代码 100% 不使用反射,可解除下方注释开启极限压缩 -->
    <!-- <IlcDisableReflection>true</IlcDisableReflection> -->

    <!-- 3. BCL 框架底层特性剔除 -->
    <!-- 全球化与诊断 -->
    <InvariantGlobalization>true</InvariantGlobalization>
    <DebuggerSupport>false</DebuggerSupport>
    <EventSourceSupport>false</EventSourceSupport>
    <HttpActivityPropagationSupport>false</HttpActivityPropagationSupport>
    <MetricsSupport>false</MetricsSupport>
    <StackTraceSupport>false</StackTraceSupport>
    <UseSystemResourceKeys>true</UseSystemResourceKeys>

    <!-- 遗留组件与底层钩子 -->
    <BuiltInComInteropSupport>false</BuiltInComInteropSupport>
    <EnableUnsafeUTF7Encoding>false</EnableUnsafeUTF7Encoding>
    <StartupHookSupport>false</StartupHookSupport>
    <MetadataUpdaterSupport>false</MetadataUpdaterSupport>

    <!-- 算法与网络库优化 -->
    <UseSizeOptimizedLinq>true</UseSizeOptimizedLinq>
    <Http3Support>false</Http3Support>
    <XmlResolverIsNetworkingEnabledByDefault>false</XmlResolverIsNetworkingEnabledByDefault>

    <!-- 4. 符号、元数据与调试信息剥离 -->
    <DebugSymbols>false</DebugSymbols>
    <DebugType>none</DebugType>
    <TrimmerRemoveSymbols>true</TrimmerRemoveSymbols>
    <StripSymbols>true</StripSymbols>

    <!-- 简化裁剪警告输出 -->
    <TrimmerSingleWarn>true</TrimmerSingleWarn>
  </PropertyGroup>

</Project>

8. 参考链接与官方文档