启用「修剪未使用代码」发布.NET 6项目时,System.Management包异常
解决.NET 6自包含修剪发布后System.Management的初始化异常
问题原因
启用「修剪未使用代码」后,.NET修剪器会移除静态分析判定为未使用的代码,但System.Management内部依赖动态加载的类型与原生库,这些依赖无法被修剪器静态检测到,导致WmiNetUtilsHelper类型初始化失败,触发TypeInitializationException,且仅在启用修剪选项时出现该问题。
解决方案
方法1:添加修剪配置文件保留关键类型
在项目根目录创建TrimmerRoots.xml文件,写入以下内容:
<linker> <assembly fullname="System.Management"> <type fullname="System.Management.WmiNetUtilsHelper" preserve="all" /> <type fullname="System.Management.ManagementClass" preserve="all" /> <!-- 若后续使用其他WMI类型仍报错,可继续添加对应type节点 --> </assembly> </linker>
修改项目文件(.csproj),添加配置让修剪器识别该文件:
<ItemGroup> <TrimmerRoots Include="TrimmerRoots.xml" /> </ItemGroup>
方法2:排除System.Management程序集的修剪
如果无需对System.Management进行代码修剪,可在项目文件中添加以下配置,跳过该程序集的修剪处理:
<ItemGroup> <TrimmerRootAssembly Include="System.Management" /> </ItemGroup>
方法3:用Runtime指令标注动态依赖
在使用WMI的代码类上添加[DynamicDependency]属性,明确告诉修剪器保留相关类型:
using System.Diagnostics.CodeAnalysis; using System.Management; [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(WmiNetUtilsHelper))] [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(ManagementClass))] public class YourWmiUsageClass { public void GetComputerInfo() { ManagementClass mgmt = new("Win32_ComputerSystem"); // 业务逻辑代码 } }
验证
重新以自包含模式发布并启用修剪选项,运行生成的可执行文件,确认异常不再触发。
内容的提问来源于stack exchange,提问作者CodingDude
相关产品推荐
相关产品推荐

