.NET 7 部署兼容性变更:TrimmerDefaultAction 属性已弃用
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
概述
在 .NET 7 中,MSBuild 属性 TrimmerDefaultAction
已被标记为弃用,其值在发布过程中不再生效。这一变更影响了应用程序的裁剪行为,可能导致现有应用程序在升级后出现运行时异常或行为变化。
裁剪机制基础
在深入理解这一变更前,我们需要了解 .NET 的裁剪机制:
- 裁剪目的:通过移除未使用的代码来减小应用程序体积
- 裁剪级别:可以针对整个程序集进行裁剪
- 裁剪警告:当裁剪可能影响运行时行为时,编译器会发出警告
变更详情
旧行为(.NET 6 及之前版本)
在 .NET 6 中:
- 只有通过
<IsTrimmable>true</IsTrimmable>
显式选择加入的库才会被裁剪 TrimmerDefaultAction
默认值为copy
,即不进行裁剪- 这种保守策略虽然减少了运行时问题,但导致应用程序体积较大
新行为(.NET 7 及之后版本)
在 .NET 7 中:
TrimmerDefaultAction
属性被完全忽略- 所有程序集默认都会被完全裁剪(相当于
link
行为) - 这一变更可能导致之前有裁剪警告的应用程序出现运行时异常
影响范围
这一变更属于源代码兼容性变更,主要影响:
- 依赖特定未裁剪行为的应用程序
- 包含裁剪警告但未解决的代码库
- 使用反射等动态特性的代码
变更原因
微软做出这一变更的主要考虑包括:
- 简化裁剪选项:减少配置复杂度
- 优化应用体积:默认获得更好的裁剪效果
- 推动生态适配:鼓励库开发者更好地支持裁剪
应对策略
推荐方案
-
解决所有裁剪警告:
- 使用
[DynamicDependency]
特性标记动态访问的成员 - 为反射使用添加必要的提示
- 使用
ILLink.Descriptors
文件指定保留规则
- 使用
-
评估依赖库:
- 优先选择已适配裁剪的库(如 System.Text.Json)
- 联系库作者请求添加裁剪支持
- 考虑替换不支持裁剪的依赖项
临时回退方案
如需暂时保持旧行为,可以:
- 使用
global.json
文件将项目固定到 .NET 6 SDK - 等待依赖库更新以支持新裁剪行为
最佳实践
-
开发阶段:
- 启用
<EnableTrimAnalyzer>true</EnableTrimAnalyzer>
- 定期检查裁剪警告
- 启用
-
测试阶段:
- 在预发布环境中全面测试裁剪后的应用
- 特别关注反射、动态代码生成等场景
-
发布阶段:
- 使用
<PublishTrimmed>true</PublishTrimmed>
明确启用裁剪 - 考虑使用
<TrimMode>partial</TrimMode>
进行部分裁剪测试
- 使用
总结
这一变更代表了 .NET 在应用优化方向上迈出的重要一步。虽然短期内可能需要开发者投入精力适配,但从长远看,这将带来更小的应用体积和更一致的裁剪行为。建议开发者积极处理裁剪警告,为应用获得最佳的优化效果。
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考