From 51f90ab4069c434a183f3f837dc38907f75c74e0 Mon Sep 17 00:00:00 2001 From: Eric Erhardt Date: Thu, 7 Jan 2021 18:10:46 -0600 Subject: [PATCH] Resolve easy ILLink warnings from InteropServices, ObjectModel, Drawing.Primitives (#46605) * Resolve ILLink warnings in System.Runtime.InteropServices * Resolve ILLink warnings in System.ObjectModel * Resolve ILLink warnings in System.Drawing.Primitives Contributes to #45623 * Remove suppression no longer needed with the latest ILLinker. * Annotate ComEventInterfaceAttribute.EventProvider to make it trim compatible. --- .../System.Private.CoreLib/src/System/__ComObject.cs | 9 ++++++--- src/libraries/Common/src/System/Drawing/ColorTable.cs | 5 ++++- .../src/ILLink/ILLink.Suppressions.xml | 8 +------- .../src/ILLink/ILLink.Suppressions.xml | 11 ----------- .../System.ObjectModel/ref/System.ObjectModel.cs | 6 ++++-- .../src/ILLink/ILLink.Suppressions.xml | 17 ----------------- .../System/Windows/Markup/ValueSerializerAttribute.cs | 9 +++++++-- .../src/ILLink/ILLink.Suppressions.Shared.xml | 6 ------ .../InteropServices/ComEventInterfaceAttribute.cs | 12 +++++++++++- .../ref/System.Runtime.InteropServices.cs | 6 ++++-- .../src/ILLink/ILLink.Suppressions.xml | 17 ----------------- .../System/Runtime/InteropServices/ComAwareEventInfo.cs | 3 ++- 12 files changed, 39 insertions(+), 70 deletions(-) delete mode 100644 src/libraries/System.Drawing.Primitives/src/ILLink/ILLink.Suppressions.xml delete mode 100644 src/libraries/System.ObjectModel/src/ILLink/ILLink.Suppressions.xml delete mode 100644 src/libraries/System.Runtime.InteropServices/src/ILLink/ILLink.Suppressions.xml diff --git a/src/coreclr/System.Private.CoreLib/src/System/__ComObject.cs b/src/coreclr/System.Private.CoreLib/src/System/__ComObject.cs index be3294f..85a2ff6 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/__ComObject.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/__ComObject.cs @@ -2,8 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections; -using System.Runtime.InteropServices; +using System.Diagnostics.CodeAnalysis; using System.Reflection; +using System.Runtime.InteropServices; using System.Runtime.Versioning; namespace System @@ -103,7 +104,8 @@ namespace System /// /// Called from within the EE and is used to handle calls on methods of event interfaces. /// - internal object GetEventProvider(RuntimeType t) + internal object GetEventProvider( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] RuntimeType t) { // Check to see if we already have a cached event provider for this type. object? provider = GetData(t); @@ -120,7 +122,8 @@ namespace System internal void FinalReleaseSelf() => Marshal.InternalFinalReleaseComObject(this); - private object CreateEventProvider(RuntimeType t) + private object CreateEventProvider( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] RuntimeType t) { // Create the event provider for the specified type. object EvProvider = Activator.CreateInstance(t, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.CreateInstance, null, new object[] { this }, null)!; diff --git a/src/libraries/Common/src/System/Drawing/ColorTable.cs b/src/libraries/Common/src/System/Drawing/ColorTable.cs index 3d96a69..6e560bb 100644 --- a/src/libraries/Common/src/System/Drawing/ColorTable.cs +++ b/src/libraries/Common/src/System/Drawing/ColorTable.cs @@ -3,6 +3,7 @@ #nullable enable using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Reflection; namespace System.Drawing @@ -19,7 +20,9 @@ namespace System.Drawing return colors; } - private static void FillWithProperties(Dictionary dictionary, Type typeWithColors) + private static void FillWithProperties( + Dictionary dictionary, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type typeWithColors) // can remove NonPublicProperties once https://github.com/mono/linker/issues/1724 is fixed { foreach (PropertyInfo prop in typeWithColors.GetProperties(BindingFlags.Public | BindingFlags.Static)) { diff --git a/src/libraries/System.ComponentModel.TypeConverter/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.ComponentModel.TypeConverter/src/ILLink/ILLink.Suppressions.xml index e5159bf..63a84c9 100644 --- a/src/libraries/System.ComponentModel.TypeConverter/src/ILLink/ILLink.Suppressions.xml +++ b/src/libraries/System.ComponentModel.TypeConverter/src/ILLink/ILLink.Suppressions.xml @@ -159,12 +159,6 @@ ILLink - IL2070 - member - M:System.Drawing.ColorTable.FillWithProperties(System.Collections.Generic.Dictionary{System.String,System.Drawing.Color},System.Type) - - - ILLink IL2072 member M:System.ComponentModel.LicenseManager.ValidateInternalRecursive(System.ComponentModel.LicenseContext,System.Type,System.Object,System.Boolean,System.ComponentModel.License@,System.String@) @@ -296,4 +290,4 @@ M:System.ComponentModel.BindingList`1.get_ItemTypeHasDefaultConstructor - \ No newline at end of file + diff --git a/src/libraries/System.Drawing.Primitives/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Drawing.Primitives/src/ILLink/ILLink.Suppressions.xml deleted file mode 100644 index f3c98e1..0000000 --- a/src/libraries/System.Drawing.Primitives/src/ILLink/ILLink.Suppressions.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - ILLink - IL2070 - member - M:System.Drawing.ColorTable.FillWithProperties(System.Collections.Generic.Dictionary{System.String,System.Drawing.Color},System.Type) - - - \ No newline at end of file diff --git a/src/libraries/System.ObjectModel/ref/System.ObjectModel.cs b/src/libraries/System.ObjectModel/ref/System.ObjectModel.cs index 582af30..2358820 100644 --- a/src/libraries/System.ObjectModel/ref/System.ObjectModel.cs +++ b/src/libraries/System.ObjectModel/ref/System.ObjectModel.cs @@ -237,9 +237,11 @@ namespace System.Windows.Markup [System.AttributeUsageAttribute(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Interface | System.AttributeTargets.Method | System.AttributeTargets.Property | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=true)] public sealed partial class ValueSerializerAttribute : System.Attribute { - public ValueSerializerAttribute(string valueSerializerTypeName) { } - public ValueSerializerAttribute(System.Type valueSerializerType) { } + public ValueSerializerAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] string valueSerializerTypeName) { } + public ValueSerializerAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] System.Type valueSerializerType) { } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] public System.Type ValueSerializerType { get { throw null; } } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors)] public string ValueSerializerTypeName { get { throw null; } } } } diff --git a/src/libraries/System.ObjectModel/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.ObjectModel/src/ILLink/ILLink.Suppressions.xml deleted file mode 100644 index 4e660a5..0000000 --- a/src/libraries/System.ObjectModel/src/ILLink/ILLink.Suppressions.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - ILLink - IL2057 - member - M:System.Windows.Markup.ValueSerializerAttribute.get_ValueSerializerType - - - ILLink - IL2079 - member - M:System.ComponentModel.TypeConverterAttribute.#ctor - - - \ No newline at end of file diff --git a/src/libraries/System.ObjectModel/src/System/Windows/Markup/ValueSerializerAttribute.cs b/src/libraries/System.ObjectModel/src/System/Windows/Markup/ValueSerializerAttribute.cs index f7e9897..45fe3b8 100644 --- a/src/libraries/System.ObjectModel/src/System/Windows/Markup/ValueSerializerAttribute.cs +++ b/src/libraries/System.ObjectModel/src/System/Windows/Markup/ValueSerializerAttribute.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; namespace System.Windows.Markup @@ -15,14 +16,16 @@ namespace System.Windows.Markup [TypeForwardedFrom("WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")] public sealed class ValueSerializerAttribute : Attribute { + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] private Type? _valueSerializerType; + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] private readonly string? _valueSerializerTypeName; /// /// Constructor for the ValueSerializerAttribute /// /// Type of the value serializer being associated with a type or property - public ValueSerializerAttribute(Type valueSerializerType) + public ValueSerializerAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type valueSerializerType) { _valueSerializerType = valueSerializerType; } @@ -31,7 +34,7 @@ namespace System.Windows.Markup /// Constructor for the ValueSerializerAttribute /// /// Fully qualified type name of the value serializer being associated with a type or property - public ValueSerializerAttribute(string valueSerializerTypeName) + public ValueSerializerAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] string valueSerializerTypeName) { _valueSerializerTypeName = valueSerializerTypeName; } @@ -39,6 +42,7 @@ namespace System.Windows.Markup /// /// The type of the value serializer to create for this type or property. /// + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public Type ValueSerializerType { get @@ -55,6 +59,7 @@ namespace System.Windows.Markup /// /// The assembly qualified name of the value serializer type for this type or property. /// + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] public string ValueSerializerTypeName { get diff --git a/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Suppressions.Shared.xml b/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Suppressions.Shared.xml index fb533a5..6a6025a 100644 --- a/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Suppressions.Shared.xml +++ b/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.Suppressions.Shared.xml @@ -69,12 +69,6 @@ ILLink - IL2067 - member - M:System.__ComObject.CreateEventProvider(System.RuntimeType) - - - ILLink IL2070 member M:System.Diagnostics.Tracing.NullableTypeInfo.#ctor(System.Type,System.Collections.Generic.List{System.Type}) diff --git a/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventInterfaceAttribute.cs b/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventInterfaceAttribute.cs index 0a3e518..a23c62d 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventInterfaceAttribute.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Runtime/InteropServices/ComEventInterfaceAttribute.cs @@ -1,18 +1,28 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.Diagnostics.CodeAnalysis; + namespace System.Runtime.InteropServices { [AttributeUsage(AttributeTargets.Interface, Inherited = false)] public sealed class ComEventInterfaceAttribute : Attribute { - public ComEventInterfaceAttribute(Type SourceInterface, Type EventProvider) + private const DynamicallyAccessedMemberTypes EventProviderAccessedMemberTypes = + DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors | + DynamicallyAccessedMemberTypes.PublicEvents | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.PublicFields; + + public ComEventInterfaceAttribute( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type SourceInterface, + [DynamicallyAccessedMembers(EventProviderAccessedMemberTypes)] Type EventProvider) { this.SourceInterface = SourceInterface; this.EventProvider = EventProvider; } + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] public Type SourceInterface { get; } + [DynamicallyAccessedMembers(EventProviderAccessedMemberTypes)] public Type EventProvider { get; } } } diff --git a/src/libraries/System.Runtime.InteropServices/ref/System.Runtime.InteropServices.cs b/src/libraries/System.Runtime.InteropServices/ref/System.Runtime.InteropServices.cs index 9bbb8e8..7f49168 100644 --- a/src/libraries/System.Runtime.InteropServices/ref/System.Runtime.InteropServices.cs +++ b/src/libraries/System.Runtime.InteropServices/ref/System.Runtime.InteropServices.cs @@ -175,7 +175,7 @@ namespace System.Runtime.InteropServices [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public partial class ComAwareEventInfo : System.Reflection.EventInfo { - public ComAwareEventInfo(System.Type type, string eventName) { } + public ComAwareEventInfo([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents)] System.Type type, string eventName) { } public override System.Reflection.EventAttributes Attributes { get { throw null; } } public override System.Type? DeclaringType { get { throw null; } } public override int MetadataToken { get { throw null; } } @@ -219,8 +219,10 @@ namespace System.Runtime.InteropServices [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] public sealed partial class ComEventInterfaceAttribute : System.Attribute { - public ComEventInterfaceAttribute(System.Type SourceInterface, System.Type EventProvider) { } + public ComEventInterfaceAttribute([System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods)] System.Type SourceInterface, [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] System.Type EventProvider) { } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)] public System.Type EventProvider { get { throw null; } } + [System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods)] public System.Type SourceInterface { get { throw null; } } } [System.Runtime.Versioning.SupportedOSPlatformAttribute("windows")] diff --git a/src/libraries/System.Runtime.InteropServices/src/ILLink/ILLink.Suppressions.xml b/src/libraries/System.Runtime.InteropServices/src/ILLink/ILLink.Suppressions.xml deleted file mode 100644 index 39f87c6..0000000 --- a/src/libraries/System.Runtime.InteropServices/src/ILLink/ILLink.Suppressions.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - ILLink - IL2070 - member - M:System.Runtime.InteropServices.ComAwareEventInfo.#ctor(System.Type,System.String) - - - ILLink - IL2075 - member - M:System.Runtime.InteropServices.ComAwareEventInfo.GetDataForComInvocation(System.Reflection.EventInfo,System.Guid@,System.Int32@) - - - \ No newline at end of file diff --git a/src/libraries/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComAwareEventInfo.cs b/src/libraries/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComAwareEventInfo.cs index 197e853..56e40be 100644 --- a/src/libraries/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComAwareEventInfo.cs +++ b/src/libraries/System.Runtime.InteropServices/src/System/Runtime/InteropServices/ComAwareEventInfo.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Runtime.Versioning; @@ -15,7 +16,7 @@ namespace System.Runtime.InteropServices { private readonly EventInfo _innerEventInfo; - public ComAwareEventInfo(Type type, string eventName) + public ComAwareEventInfo([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicEvents)] Type type, string eventName) { _innerEventInfo = type.GetEvent(eventName)!; } -- 2.7.4