原因
如果通过反射访问方法,则剪裁器无法保证满足 DynamicallyAccessedMembersAttribute 的所有要求。
示例
此警告可能是通过直接访问具有 DynamicallyAccessedMembersAttribute 参数或返回类型的方法引起的。
void MethodWithRequirements([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type type)
{
}
void TestMethod()
{
// IL2111: Method 'MethodWithRequirements' with parameters or return value with `DynamicallyAccessedMembersAttribute` is accessed via reflection. Trimmer can't guarantee availability of the requirements of the method.
typeof(Test).GetMethod("MethodWithRequirements");
}
此警告也可能由将类型传递给带批 DynamicallyAccessedMembersAttribute注的字段、参数、参数或返回值引起。 DynamicallyAccessedMembersAttribute 表示对列出的所有项 DynamicallyAccessedMemberTypes的反射访问。 这意味着,当类型传递给参数、字段、泛型参数或使用 PublicMethods .NET 工具批注的返回值时,假定所有公共方法都通过反射访问。 如果包含带批注参数或返回值的方法的类型传递给带批 PublicMethods注的位置,则将引发 IL2111。
class TypeWithAnnotatedMethod
{
void MethodWithRequirements([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicFields)] Type type)
{
}
}
class OtherType
{
void AccessMethodViaReflection([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type type)
{
}
void PassTypeToAnnotatedMethod()
{
// IL2111: Method 'MethodWithRequirements' with parameters or return value with `DynamicallyAccessedMembersAttribute` is accessed via reflection. Trimmer can't guarantee availability of the requirements of the method.
AccessMethodViaReflection(typeof(TypeWithAnnotatedMethod));
}
}