如何解决可修剪配置下的IL2080警告问题?
问题解答
警告产生的原因
这个IL2080警告是.NET修剪分析器抛出的,核心逻辑是:
- 你的代码通过
ValueType.GetConstructor(Type.EmptyTypes)反射获取目标类型的无参公共构造函数,但修剪器无法确定ValueType指向的类型是否真的包含该构造函数,也不知道这个构造函数在修剪时是否需要被保留。 - 字段
ValueType没有添加对应的注解,明确告知修剪器“这个Type对应的类型必须保留无参公共构造函数”,所以分析器判定此处存在修剪后运行时出错的风险。
和可修剪配置的关联
<IsTrimmable>true:开启后,.NET发布工具会对程序集做修剪优化,移除未被直接引用的代码(包括未被显式调用的构造函数、方法等),以此减小程序体积。<EnableTrimAnalyzer>true:启用修剪分析器,在编译阶段提前扫描代码,找出所有可能因修剪导致反射失效、成员缺失的场景,提前抛出警告。- 没开这两个配置时,修剪器和分析器都不工作,自然不会检测出这个潜在风险,也就不会出现警告。
不关闭配置的解决方法
方法1:给ValueType字段添加注解
直接在ValueType字段上标注[DynamicallyAccessedMembers]注解,明确告诉修剪器该类型必须保留无参公共构造函数。需要先引入System.Diagnostics.CodeAnalysis命名空间。
修改后的代码:
using System; using System.ComponentModel; using System.Collections; using System.Diagnostics; using System.Globalization; using System.Reflection; using System.Diagnostics.CodeAnalysis; // 新增命名空间 namespace MigraDocCore.DocumentObjectModel.Internals { public abstract class ValueDescriptor { // 添加注解 [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] public Type ValueType; internal ValueDescriptor(Type valueType) { this.ValueType = valueType; } public object CreateValue() { ConstructorInfo constructorInfoObj = ValueType.GetConstructor(Type.EmptyTypes); return constructorInfoObj.Invoke(null); } // [...] } }
方法2:给构造函数的参数添加注解
如果ValueDescriptor的所有实例在创建时,传入的valueType都保证有公共无参构造函数,也可以给构造函数的valueType参数添加同样的注解,让字段继承这个要求:
internal ValueDescriptor( [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type valueType) { this.ValueType = valueType; }
方法3:抑制警告(仅特殊场景使用)
如果确定代码能处理构造函数不存在的情况(比如加了空判断),可以用UnconditionalSuppressMessage抑制警告,但不推荐优先使用,因为会隐藏潜在风险:
public object CreateValue() { #pragma warning disable IL2080 ConstructorInfo constructorInfoObj = ValueType.GetConstructor(Type.EmptyTypes); #pragma warning restore IL2080 if (constructorInfoObj == null) { // 处理构造函数不存在的逻辑 throw new InvalidOperationException($"类型 {ValueType.Name} 没有公共无参构造函数"); } return constructorInfoObj.Invoke(null); }
内容的提问来源于stack exchange,提问作者Stefan Steiger
相关产品推荐
相关产品推荐

