.net 8 有什么新功能

来源:这里教程网 时间:2026-02-21 17:38:23 作者:

.NET 8 已于 2023 年 11 月正式发布(你看到的“2025年”资料多为知识库时间戳误标),它不是小修小补,而是面向云原生、AI 和现代化部署的一次关键跃迁。如果你正在评估升级路径或启动新项目,以下四点是真正影响日常开发的关键变化。

PGO 默认启用:性能提升不用改代码

动态配置文件引导优化(

PGO
)现在默认开启,.NET 运行时会自动收集热点方法调用数据,并在后续发布中重编译优化——这意味着你不需要改一行业务逻辑,
dotnet publish
出来的应用就可能快 10%~20%。

必须配合
Release
配置 +
PublishReadyToRun=true
才能生效(AOT 场景下 PGO 效果更明显)
首次运行略慢(要采集 profile),但后续启动和吞吐量显著改善;CI/CD 中建议加
--no-restore --no-build
避免重复采集干扰
别手动关掉
<publishprofileguidance>true</publishprofileguidance>
—— 它是 PGO 的开关之一,关了就白等

.NET Aspire:微服务本地开发终于不靠猜了

以前搭个带 Redis、PostgreSQL、OpenTelemetry 的本地微服务环境,光 Docker Compose 就要调半小时。

dotnet new aspire
现在能一键生成带健康检查、遥测、配置绑定和可视化仪表板的完整拓扑。

组件全部基于
Aspire.Hosting
构建,不是黑盒容器——你可以直接在 C# 里写
builder.AddRedis("cache")
,它自动处理连接字符串、健康探测、依赖顺序
调试时按 F5 启动整个拓扑,VS 或 VS Code 会自动附加所有服务,断点跨服务有效 注意:
Aspire Dashboard
默认只监听
localhost:18888
,若用 WSL 或远程开发,需显式设
--dashboard-hostname 0.0.0.0

容器发布无需 Dockerfile:但 root 权限陷阱还在

dotnet publish -p:PublishProfile=DefaultContainer
可直接产出可运行容器镜像,连
Dockerfile
都不用写。但默认生成的镜像是非 root 用户运行——这点很安全,也很容易翻车。

如果你的应用依赖
bind to port 80
或访问
/dev
设备,会直接 Permission Denied;解决方式是加
<containeruser>root</containeruser>
到项目文件,或改用
--user 0:0
启动容器
基础镜像已换成
mcr.microsoft.com/dotnet/runtime-deps:8.0-chiseled
(Chiseled Ubuntu),体积缩小约 40%,但移除了
glibc
—— 所有 native 依赖必须用 musl 编译或明确声明兼容
想查镜像 digest?用
dotnet publish -p:PublishProfile=DefaultContainer --getProperty:GeneratedContainerDigest

AOT 编译落地:但不是所有库都 ready

dotnet publish -r linux-x64 --aot
现在能生成真正无 JIT、无 IL 的原生二进制,启动快、内存低、适合边缘或 Serverless 场景。但它对反射、动态代码生成极度敏感。

EF Core 查询、Newtonsoft.Json 序列化、甚至部分 ASP.NET Core 中间件(如
UseDeveloperExceptionPage
)在 AOT 下默认禁用——必须显式添加
DynamicDependency
或改用
System.Text.Json
+
JsonSerializerContext
第三方 NuGet 包若没标注
IsTrimmable=true
或提供
LinkerConfig.xml
,大概率会在 AOT 构建时报
ILLink : error IL1012
验证是否真 AOT:运行
file yourapp
,输出应含
ELF 64-bit LSB pie executable
,而非
shared object

真正卡住团队的,往往不是“有没有新功能”,而是 PGO 对 CI 流水线的影响、Aspire 组件版本与底层容器镜像的兼容性、或者 AOT 下某个冷门反射调用突然失效——这些细节不会出现在发布会 PPT 里,但每天都在构建日志里报错。

相关推荐