IL2111:通过反射访问带有参数或具有“DynamicallyAccessedMembersAttribute”的返回值的方法。 剪裁器无法保证方法要求的可用性

原因

如果通过反射访问方法,则剪裁器无法保证满足 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));
    }
}