.NET 8 四大关键变化:PGO 默认启用提升性能10%~20%;Aspire 简化微服务本地开发;容器发布免 Dockerfile 但需注意 root 权限与 chiseled 镜像兼容性;AOT 编译落地但反射等动态功能受限。
.NET 8 已于 2025 年 11 月正式发布(你看到的“2025年”资料多为知识库时间戳误标),它不是小修小补,而是面向云原生、AI 和现代化部署的一次关键跃迁。如果你正在评估升级路径或启动新项目,以下四点是真正影响日常开发的关键变化。
动态配置文件引导优化(PGO)现在默认开启,.NET 运行时会自动收集热点方法调用数据,并在后续发布中重编译优化——这意味着你不需要改一行业务逻辑,dotnet publish 出来的应用就可能快 10%~20%。
Release 配置 + PublishReadyToRun=true 才能生效(AOT 场景下 PGO 效果更明显)--no-restore --no-build 避免重复采集干扰true —— 它是 PGO 的开关之一,关了就白等以前搭个带 Redis、PostgreSQL、OpenTelemetr

dotnet new aspire 现在能一键生成带健康检查、遥测、配置绑定和可视化仪表板的完整拓扑。
Aspire.Hosting 构建,不是黑盒容器——你可以直接在 C# 里写 builder.AddRedis("cache"),它自动处理连接字符串、健康探测、依赖顺序Aspire Dashboard 默认只监听 localhost:18888,若用 WSL 或远程开发,需显式设 --dashboard-hostname 0.0.0.0
dotnet publish -p:PublishProfile=DefaultContainer 可直接产出可运行容器镜像,连 Dockerfile 都不用写。但默认生成的镜像是非 root 用户运行——这点很安全,也很容易翻车。
bind to port 80 或访问 /dev 设备,会直接 Permission Denied;解决方式是加 root 到项目文件,或改用 --user 0:0 启动容器mcr.microsoft.com/dotnet/runtime-deps:8.0-chiseled(Chiseled Ubuntu),体积缩小约 40%,但移除了 glibc —— 所有 native 依赖必须用 musl 编译或明确声明兼容dotnet publish -p:PublishProfile=DefaultContainer --getProperty:GeneratedContainerDigest
dotnet publish -r linux-x64 --aot 现在能生成真正无 JIT、无 IL 的原生二进制,启动快、内存低、适合边缘或 Serverless 场景。但它对反射、动态代码生成极度敏感。
UseDeveloperExceptionPage)在 AOT 下默认禁用——必须显式添加 DynamicDependency 或改用 System.Text.Json + JsonSerializerContext
IsTrimmable=true 或提供 LinkerConfig.xml,大概率会在 AOT 构建时报 ILLink : error IL1012
file yourapp,输出应含 ELF 64-bit LSB pie executable,而非 shared object
真正卡住团队的,往往不是“有没有新功能”,而是 PGO 对 CI 流水线的影响、Aspire 组件版本与底层容器镜像的兼容性、或者 AOT 下某个冷门反射调用突然失效——这些细节不会出现在发布会 PPT 里,但每天都在构建日志里报错。