.NET 中的新增功能系列文章------.NET SDK中的新增功能
作为全栈工程师,我们每天都在和 .NET SDK 打交道。从 dotnet build 到 dotnet publish,SDK 的每一次更新都直接影响着我们的开发效率和部署体验。本文将聚焦 .NET SDK 在近期版本(.NET 8/9 为主)中的关键新增功能,并通过实战代码演示,带你快速上手这些提升生产力的特性。## 1. 更快的构建与增量编译:dotnet build 的智能缓存在 .NET 8 中,SDK 引入了 增量构建缓存 的优化。以前,即使只改了一个文件,dotnet build 也可能重新编译整个项目。现在,SDK 会基于文件哈希和依赖图进行细粒度的缓存,大幅缩短构建时间。实战演示 :观察两次构建的日志差异。bash# 第一次构建(冷启动)dotnet build MyApp.csproj --no-restore -v minimal# 修改一个源文件后,第二次构建(热缓存)dotnet build MyApp.csproj --no-restore -v minimal在 .NET 8+ 中,你会看到第二次构建的输出中,CoreCompile 步骤被标记为 Skipped 或 Up-to-date,耗时从几秒降到几百毫秒。这个特性对 CI/CD 流水线尤其友好,减少了重复编译的等待时间。代码示例 :如果你需要强制禁用缓存(比如排查问题),可以加上 -p:BuildInParallel=false 或清除 obj 目录:bash# 清理 obj 目录强制全量编译dotnet clean MyApp.csprojdotnet build MyApp.csproj --no-incremental## 2. 全新的 dotnet publish 单文件与 AOT 支持.NET SDK 进一步强化了 Native AOT 发布 和 单文件发布 。在 .NET 8 中,AOT 发布已支持 Windows 和 Linux 的常见场景,且生成的二进制体积更小、启动更快。实战演示 :创建一个最小 Web API 并发布为 AOT 单文件。csharp// Program.csvar builder = WebApplication.CreateSlimBuilder(args);var app = builder.Build();app.MapGet("/", () => "Hello from .NET AOT!");app.Run();发布命令(需安装对应的 AOT 工作负载):bash# 安装 AOT 工作负载(仅需一次)dotnet workload install wasm-experimental # 如果目标为 WASI 则用这个# 对于标准 AOT,使用:dotnet publish -c Release -r linux-x64 -p:PublishAot=true -p:PublishSingleFile=true运行效果 :生成的可执行文件(如 myapp)无需安装 .NET Runtime,直接运行:bash./myapp# 输出:Hello from .NET AOT!注意事项 :AOT 发布不支持反射(部分场景需使用源码生成器),但 SDK 会提供编译期警告,帮助你规避风险。## 3. dotnet test 的并行化与测试过滤增强测试是工程质量的基石。.NET SDK 9 引入了 测试并行化 的默认优化------在多个测试项目间并行执行,且支持更细粒度的过滤语法。实战示例 :使用 --filter 配合新语法。csharp// MyTests.cs[TestClass]public class UnitTest1{ [TestMethod] [TestCategory("Fast")] public void TestMethod1() { } [TestMethod] [TestCategory("Slow")] public void TestMethod2() { }}运行命令:bash# 只运行 Fast 类别的测试,并并行执行多个测试程序集dotnet test MySolution.sln --filter "TestCategory=Fast" --parallel新增的 DSL 语法 :支持 |(或)、&(与)和括号嵌套,例如:bashdotnet test --filter "(TestCategory=Fast|TestCategory=Medium)&FullyQualifiedName~Integration"这个功能在大型解决方案中能显著缩短测试反馈周期。## 4. 模板引擎的增强:自定义模板参数与条件.NET SDK 的 dotnet new 命令在 8.0+ 支持了 自定义模板参数 的无提示交互。你可以通过 .template.config 中的 datatype 和 defaultValue 来定义更复杂的输入。实战演示 :创建一个支持多框架选择的模板。json// .template.config/template.json{ "$schema": "http://json.schemastore.org/template", "author": "YourName", "classifications": ["Web", "API"], "identity": "My.Custom.Template", "name": "My Custom API", "shortName": "myapi", "symbols": { "Framework": { "type": "parameter", "datatype": "choice", "choices": [ { "choice": "net8.0", "description": ".NET 8" }, { "choice": "net9.0", "description": ".NET 9" } ], "defaultValue": "net8.0" } }}使用模板:bashdotnet new install ./path/to/templatedotnet new myapi -n MyNewApi --Framework net9.0这会自动生成 .csproj 中指定的目标框架,避免了手动修改项目文件的繁琐。## 5. dotnet workload 的改进:更智能的依赖解析对于移动端(MAUI)或 WebAssembly 开发,工作负载管理是痛点。.NET 9 SDK 改进了 dotnet workload 命令,支持 事务性安装 和 离线安装包 的校验。常用命令演示 :bash# 列出已安装的工作负载dotnet workload list# 安装 MAUI(自动处理依赖)dotnet workload install maui-android# 修复损坏的工作负载dotnet workload repair此外,SDK 现在会生成一个 workload-set 文件,确保团队内所有开发者使用相同版本的工作负载,避免"我机器上能跑"的尴尬。## 6. 容器镜像的简化:dotnet publish 直接生成 OCI 镜像.NET 8 SDK 内置了 容器发布 支持,不需要 Dockerfile。只需在项目文件中启用容器属性:xml<!-- MyApi.csproj --><PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0</TargetFramework> <ContainerImageName>my-api</ContainerImageName> <ContainerImageTag>latest</ContainerImageTag></PropertyGroup>构建并推送镜像:bashdotnet publish -c Release --os linux --arch x64 -p:PublishProfile=DefaultContainer这会直接调用本机 Docker 守护进程生成镜像,并打印镜像 ID。对于微服务团队来说,减少了 Dockerfile 的维护成本。## 7. 诊断与调试:dotnet-counters 和 dotnet-dump 的新命令SDK 附带的诊断工具也迎来更新。dotnet-counters 现在支持 --counters 参数来监控自定义指标。实战示例 :监控进程的内存和 CPU 使用率。bash# 监控进程ID为1234的GC和CPU指标,每秒刷新dotnet-counters monitor --process-id 1234 --counters "System.Runtime[cpu-usage,gc-heap-size]" --interval 1另外,dotnet-dump 新增了 collect -o 命令,可以收集包含完整内存转储的文件,便于离线分析:bashdotnet-dump collect --process-id 1234 -o /tmp/crash.dmp## 总结.NET SDK 的新增功能远不止于此,但从工程效能角度看,增量编译缓存 、AOT 单文件发布 、测试并行化 、模板参数增强 、工作负载管理 、容器直出 以及 诊断工具 是当前最值得升级的理由。这些特性不仅减少了重复劳动,还让 CI/CD 流水线更绿色(更少的 CPU 消耗)和更快。对于全栈工程师,我的建议是:立即将本地 SDK 升级到 .NET 9(或至少 .NET 8 LTS),并在一个小型项目中试点这些功能。特别是 AOT 发布,虽然有一些反射限制,但对于 API 网关、CLI 工具等场景,收益非常明显。希望本文的代码演示能帮助你快速上手。下一篇文章,我们将深入 .NET 运行时中的新特性(如正则表达式源生成器、时间抽象),敬请期待。