dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
14.8k stars 4.61k forks source link

ILLink warns for virtual method annotations on unused code #98870

Open sbomer opened 5 months ago

sbomer commented 5 months ago
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.

ghost commented 5 months ago

Tagging subscribers to this area: @dotnet/area-system-reflection See info in area-owners.md if you want to be subscribed.

Issue Details
```csharp 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. `PublishILLink` should do the same.
Author: sbomer
Assignees: -
Labels: `area-System.Reflection`
Milestone: -
ghost commented 5 months ago

Tagging subscribers to this area: @agocke, @sbomer, @vitek-karas See info in area-owners.md if you want to be subscribed.

Issue Details
```csharp 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. `PublishILLink` should do the same.
Author: sbomer
Assignees: -
Labels: `untriaged`, `area-Tools-ILLink`
Milestone: -