Skip to content

ILLink warns for virtual method annotations on unused code #98870

Description

@sbomer
using System.Reflection;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;

_ = 0;

public class C : IReflect {
    Type IReflect.UnderlyingSystemType => typeof(C);
    FieldInfo? IReflect.GetField(string s, BindingFlags b) => null;
    FieldInfo[] IReflect.GetFields(BindingFlags b) => new FieldInfo[] {};
    PropertyInfo? IReflect.GetProperty(string name, BindingFlags bindingAttr) => null;
    PropertyInfo[] IReflect.GetProperties(BindingFlags bindingAttr) => new PropertyInfo[] {};
    PropertyInfo? IReflect.GetProperty(string name, BindingFlags bindingAttr, Binder? binder, Type? t, Type[] types, ParameterModifier[]? ps) => null;
    MethodInfo? IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder? binder, Type[] types, ParameterModifier[]? ps) => null;
    MethodInfo? IReflect.GetMethod(string name, BindingFlags bindingAttr) => null;
    MethodInfo[] IReflect.GetMethods(BindingFlags bindingAttr) => new MethodInfo[] {};
    MemberInfo[] IReflect.GetMember(string name, BindingFlags bindingAttr) => null;
    MemberInfo[] IReflect.GetMembers(BindingFlags bindingAttr) => null;
    object? IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder? binder, object? target, object?[]? args, ParameterModifier[]? modifiers, CultureInfo? culture, string[]? namedParameters) => null;
}

PublishTrimmed produces the following even though C and IReflect are unused:

Program.cs(10,63): Trim analysis warning IL2046: C.System.Reflection.IReflect.GetField(String, BindingFlags): Member 'C.System.Reflection.IReflect.GetField(String, BindingFlags)' with 'RequiresUnreferencedCodeAttribute' implements interface member 'System.Reflection.IReflect.GetField(String, BindingFlags)' without 'RequiresUnreferencedCodeAttribute'. 'RequiresUnreferencedCodeAttribute' annotations must match across all interface implementations or overrides.
Program.cs(10,63): Trim analysis warning IL2094: C.System.Reflection.IReflect.GetField(String, BindingFlags): 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'C.System.Reflection.IReflect.GetField(String, BindingFlags)' don't match overridden implicit 'this' parameter of method 'System.Reflection.IReflect.GetField(String, BindingFlags)'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
Program.cs(11,55): Trim analysis warning IL2046: C.System.Reflection.IReflect.GetFields(BindingFlags): Member 'C.System.Reflection.IReflect.GetFields(BindingFlags)' with 'RequiresUnreferencedCodeAttribute' implements interface member 'System.Reflection.IReflect.GetFields(BindingFlags)' without 'RequiresUnreferencedCodeAttribute'. 'RequiresUnreferencedCodeAttribute' annotations must match across all interface implementations or overrides.
Program.cs(11,55): Trim analysis warning IL2094: C.System.Reflection.IReflect.GetFields(BindingFlags): 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'C.System.Reflection.IReflect.GetFields(BindingFlags)' don't match overridden implicit 'this' parameter of method 'System.Reflection.IReflect.GetFields(BindingFlags)'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
Program.cs(15,133): Trim analysis warning IL2046: C.System.Reflection.IReflect.GetMethod(String, BindingFlags, Binder, Type[], ParameterModifier[]): Member 'C.System.Reflection.IReflect.GetMethod(String, BindingFlags, Binder, Type[], ParameterModifier[])' with 'RequiresUnreferencedCodeAttribute' implements interface member 'System.Reflection.IReflect.GetMethod(String, BindingFlags, Binder, Type[], ParameterModifier[])' without 'RequiresUnreferencedCodeAttribute'. 'RequiresUnreferencedCodeAttribute' annotations must match across all interface implementations or overrides.
Program.cs(15,133): Trim analysis warning IL2094: C.System.Reflection.IReflect.GetMethod(String, BindingFlags, Binder, Type[], ParameterModifier[]): 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'C.System.Reflection.IReflect.GetMethod(String, BindingFlags, Binder, Type[], ParameterModifier[])' don't match overridden implicit 'this' parameter of method 'System.Reflection.IReflect.GetMethod(String, BindingFlags, Binder, Type[], ParameterModifier[])'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
Program.cs(16,78): Trim analysis warning IL2094: C.System.Reflection.IReflect.GetMethod(String, BindingFlags): 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'C.System.Reflection.IReflect.GetMethod(String, BindingFlags)' don't match overridden implicit 'this' parameter of method 'System.Reflection.IReflect.GetMethod(String, BindingFlags)'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
Program.cs(16,78): Trim analysis warning IL2046: C.System.Reflection.IReflect.GetMethod(String, BindingFlags): Member 'C.System.Reflection.IReflect.GetMethod(String, BindingFlags)' with 'RequiresUnreferencedCodeAttribute' implements interface member 'System.Reflection.IReflect.GetMethod(String, BindingFlags)' without 'RequiresUnreferencedCodeAttribute'. 'RequiresUnreferencedCodeAttribute' annotations must match across all interface implementations or overrides.
Program.cs(17,67): Trim analysis warning IL2046: C.System.Reflection.IReflect.GetMethods(BindingFlags): Member 'C.System.Reflection.IReflect.GetMethods(BindingFlags)' with 'RequiresUnreferencedCodeAttribute' implements interface member 'System.Reflection.IReflect.GetMethods(BindingFlags)' without 'RequiresUnreferencedCodeAttribute'. 'RequiresUnreferencedCodeAttribute' annotations must match across all interface implementations or overrides.
Program.cs(17,67): Trim analysis warning IL2094: C.System.Reflection.IReflect.GetMethods(BindingFlags): 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'C.System.Reflection.IReflect.GetMethods(BindingFlags)' don't match overridden implicit 'this' parameter of method 'System.Reflection.IReflect.GetMethods(BindingFlags)'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
Program.cs(13,72): Trim analysis warning IL2046: C.System.Reflection.IReflect.GetProperties(BindingFlags): Member 'C.System.Reflection.IReflect.GetProperties(BindingFlags)' with 'RequiresUnreferencedCodeAttribute' implements interface member 'System.Reflection.IReflect.GetProperties(BindingFlags)' without 'RequiresUnreferencedCodeAttribute'. 'RequiresUnreferencedCodeAttribute' annotations must match across all interface implementations or overrides.
Program.cs(13,72): Trim analysis warning IL2094: C.System.Reflection.IReflect.GetProperties(BindingFlags): 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'C.System.Reflection.IReflect.GetProperties(BindingFlags)' don't match overridden implicit 'this' parameter of method 'System.Reflection.IReflect.GetProperties(BindingFlags)'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
Program.cs(12,82): Trim analysis warning IL2046: C.System.Reflection.IReflect.GetProperty(String, BindingFlags): Member 'C.System.Reflection.IReflect.GetProperty(String, BindingFlags)' with 'RequiresUnreferencedCodeAttribute' implements interface member 'System.Reflection.IReflect.GetProperty(String, BindingFlags)' without 'RequiresUnreferencedCodeAttribute'. 'RequiresUnreferencedCodeAttribute' annotations must match across all interface implementations or overrides.
Program.cs(14,146): Trim analysis warning IL2046: C.System.Reflection.IReflect.GetProperty(String, BindingFlags, Binder, Type, Type[], ParameterModifier[]): Member 'C.System.Reflection.IReflect.GetProperty(String, BindingFlags, Binder, Type, Type[], ParameterModifier[])' with 'RequiresUnreferencedCodeAttribute' implements interface member 'System.Reflection.IReflect.GetProperty(String, BindingFlags, Binder, Type, Type[], ParameterModifier[])' without 'RequiresUnreferencedCodeAttribute'. 'RequiresUnreferencedCodeAttribute' annotations must match across all interface implementations or overrides.
Program.cs(14,146): Trim analysis warning IL2094: C.System.Reflection.IReflect.GetProperty(String, BindingFlags, Binder, Type, Type[], ParameterModifier[]): 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'C.System.Reflection.IReflect.GetProperty(String, BindingFlags, Binder, Type, Type[], ParameterModifier[])' don't match overridden implicit 'this' parameter of method 'System.Reflection.IReflect.GetProperty(String, BindingFlags, Binder, Type, Type[], ParameterModifier[])'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
Program.cs(12,82): Trim analysis warning IL2094: C.System.Reflection.IReflect.GetProperty(String, BindingFlags): 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'C.System.Reflection.IReflect.GetProperty(String, BindingFlags)' don't match overridden implicit 'this' parameter of method 'System.Reflection.IReflect.GetProperty(String, BindingFlags)'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
Program.cs(20,206): Trim analysis warning IL2094: C.System.Reflection.IReflect.InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]): 'DynamicallyAccessedMemberTypes' in 'DynamicallyAccessedMembersAttribute' on the implicit 'this' parameter of method 'C.System.Reflection.IReflect.InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])' don't match overridden implicit 'this' parameter of method 'System.Reflection.IReflect.InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])'. All overridden members must have the same 'DynamicallyAccessedMembersAttribute' usage.
Program.cs(20,206): Trim analysis warning IL2046: C.System.Reflection.IReflect.InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[]): Member 'C.System.Reflection.IReflect.InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])' with 'RequiresUnreferencedCodeAttribute' implements interface member 'System.Reflection.IReflect.InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])' without 'RequiresUnreferencedCodeAttribute'. 'RequiresUnreferencedCodeAttribute' annotations must match across all interface implementations or overrides.

The analyzer produces these warnings since it sees the whole project. PublishAot does not because it only looks at used code. PublishTrimmed should do the same.

Metadata

Metadata

Labels

area-Tools-ILLink.NET linker development as well as trimming analyzers

Type

No type

Fields

No fields configured for issues without a type.

Projects

Status
No status

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions