You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用「修剪未使用代码」发布.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:17:31