From 1dc0187d144a6be912fee8658bf4b1e3b8452095 Mon Sep 17 00:00:00 2001 From: Layomi Akinrinade Date: Wed, 3 Jun 2020 12:17:24 -0700 Subject: [PATCH 1/4] Strip the ILLinkTrim.xml file from the System.ComponentModel.TypeConverter assembly --- .../src/Internal/Runtime/InteropServices/ComActivator.cs | 2 ++ .../src/{ILLinkTrim.xml => ILLinkTrim_LibraryBuild.xml} | 0 .../src/System/ComponentModel/TypeDescriptor.cs | 2 +- .../ComponentModel/TypeDescriptionProviderAttribute.cs | 6 ++++-- .../src/System/ComponentModel/DefaultValueAttribute.cs | 2 ++ 5 files changed, 9 insertions(+), 3 deletions(-) rename src/libraries/System.ComponentModel.TypeConverter/src/{ILLinkTrim.xml => ILLinkTrim_LibraryBuild.xml} (100%) diff --git a/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs b/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs index ffecc9b0d493b0..a04bdd0011744d 100644 --- a/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs +++ b/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Reflection; using System.Runtime.InteropServices; @@ -601,6 +602,7 @@ internal sealed class LicenseInteropProxy // LicenseContext private readonly MethodInfo _setSavedLicenseKey; + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.DefaultConstructor)] private readonly Type _licInfoHelper; private readonly MethodInfo _licInfoHelperContains; diff --git a/src/libraries/System.ComponentModel.TypeConverter/src/ILLinkTrim.xml b/src/libraries/System.ComponentModel.TypeConverter/src/ILLinkTrim_LibraryBuild.xml similarity index 100% rename from src/libraries/System.ComponentModel.TypeConverter/src/ILLinkTrim.xml rename to src/libraries/System.ComponentModel.TypeConverter/src/ILLinkTrim_LibraryBuild.xml diff --git a/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs b/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs index 6d91d412d2ce76..50526d64816a8d 100644 --- a/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs +++ b/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs @@ -2320,7 +2320,7 @@ public static void Refresh(Assembly assembly) public static Type ComObjectType { [PreserveDependency(".ctor", "System.ComponentModel.TypeDescriptor/TypeDescriptorComObject")] - [PreserveDependency(".ctor", "System.ComponentModel.TypeDescriptor/ComNativeDescriptorProxy")] // TODO: https://github.com/mono/linker/issues/801 + [PreserveDependency(".ctor", "System.ComponentModel.TypeDescriptor/ComNativeDescriptorProxy")] get => typeof(TypeDescriptorComObject); } diff --git a/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs b/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs index c5c4cbfaa60364..14866ced2066e5 100644 --- a/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs +++ b/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs @@ -2,6 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics.CodeAnalysis; + namespace System.ComponentModel { [AttributeUsage(AttributeTargets.Class, Inherited = true)] @@ -10,7 +12,7 @@ public sealed class TypeDescriptionProviderAttribute : Attribute /// /// Creates a new TypeDescriptionProviderAttribute object. /// - public TypeDescriptionProviderAttribute(string typeName) + public TypeDescriptionProviderAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.DefaultConstructor)] string typeName) { if (typeName == null) { @@ -23,7 +25,7 @@ public TypeDescriptionProviderAttribute(string typeName) /// /// Creates a new TypeDescriptionProviderAttribute object. /// - public TypeDescriptionProviderAttribute(Type type) + public TypeDescriptionProviderAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.DefaultConstructor)] Type type) { if (type == null) { diff --git a/src/libraries/System.Private.CoreLib/src/System/ComponentModel/DefaultValueAttribute.cs b/src/libraries/System.Private.CoreLib/src/System/ComponentModel/DefaultValueAttribute.cs index b15719bbb87244..6f7b720b6f42b3 100644 --- a/src/libraries/System.Private.CoreLib/src/System/ComponentModel/DefaultValueAttribute.cs +++ b/src/libraries/System.Private.CoreLib/src/System/ComponentModel/DefaultValueAttribute.cs @@ -4,6 +4,7 @@ using System.Globalization; using System.Reflection; +using System.Runtime.CompilerServices; using System.Threading; namespace System.ComponentModel @@ -27,6 +28,7 @@ public class DefaultValueAttribute : Attribute /// class, converting the specified value to the specified type, and using the U.S. English /// culture as the translation context. /// + [PreserveDependency("ConvertFromInvariantString", "System.ComponentModel.TypeConverter", "System.ComponentModel.TypeConverter")] public DefaultValueAttribute(Type type, string? value) { // The null check and try/catch here are because attributes should never throw exceptions. From 4702782ccb5de6d3c04ea7ed53d5d09a7268fd45 Mon Sep 17 00:00:00 2001 From: Layomi Akinrinade Date: Thu, 4 Jun 2020 10:58:25 -0700 Subject: [PATCH 2/4] Address review feedback --- .../src/System/ComponentModel/TypeDescriptor.cs | 3 +-- .../System/ComponentModel/TypeDescriptionProviderAttribute.cs | 1 + .../src/System/ComponentModel/DefaultValueAttribute.cs | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs b/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs index 50526d64816a8d..c1bedbd58786ff 100644 --- a/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs +++ b/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs @@ -2319,8 +2319,7 @@ public static void Refresh(Assembly assembly) [EditorBrowsable(EditorBrowsableState.Advanced)] public static Type ComObjectType { - [PreserveDependency(".ctor", "System.ComponentModel.TypeDescriptor/TypeDescriptorComObject")] - [PreserveDependency(".ctor", "System.ComponentModel.TypeDescriptor/ComNativeDescriptorProxy")] + [DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.DefaultConstructor)] get => typeof(TypeDescriptorComObject); } diff --git a/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs b/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs index 14866ced2066e5..d5a480a8df6448 100644 --- a/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs +++ b/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs @@ -39,6 +39,7 @@ public TypeDescriptionProviderAttribute([DynamicallyAccessedMembers(DynamicallyA /// The TypeName property returns the assembly qualified type name /// for the type description provider. /// + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.DefaultConstructor)] public string TypeName { get; } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/ComponentModel/DefaultValueAttribute.cs b/src/libraries/System.Private.CoreLib/src/System/ComponentModel/DefaultValueAttribute.cs index 6f7b720b6f42b3..044d05949fe047 100644 --- a/src/libraries/System.Private.CoreLib/src/System/ComponentModel/DefaultValueAttribute.cs +++ b/src/libraries/System.Private.CoreLib/src/System/ComponentModel/DefaultValueAttribute.cs @@ -28,6 +28,7 @@ public class DefaultValueAttribute : Attribute /// class, converting the specified value to the specified type, and using the U.S. English /// culture as the translation context. /// + // TODO: https://github.com/mono/linker/issues/943 [PreserveDependency("ConvertFromInvariantString", "System.ComponentModel.TypeConverter", "System.ComponentModel.TypeConverter")] public DefaultValueAttribute(Type type, string? value) { From e4a268be86890da67575954d8aadf84ab884d20c Mon Sep 17 00:00:00 2001 From: Layomi Akinrinade Date: Thu, 4 Jun 2020 11:54:27 -0700 Subject: [PATCH 3/4] Update DefaultConstructor -> PublicParameterlessConstructor --- .../src/Internal/Runtime/InteropServices/ComActivator.cs | 2 +- .../src/System/ComponentModel/TypeDescriptor.cs | 2 +- .../ComponentModel/TypeDescriptionProviderAttribute.cs | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs b/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs index e8656d74fc158c..40e40d5b9d99c9 100644 --- a/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs +++ b/src/coreclr/src/System.Private.CoreLib/src/Internal/Runtime/InteropServices/ComActivator.cs @@ -701,7 +701,7 @@ internal sealed class LicenseInteropProxy // LicenseContext private readonly MethodInfo _setSavedLicenseKey; - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.DefaultConstructor)] + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] private readonly Type _licInfoHelper; private readonly MethodInfo _licInfoHelperContains; diff --git a/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs b/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs index c1bedbd58786ff..be9226173b2642 100644 --- a/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs +++ b/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs @@ -2319,7 +2319,7 @@ public static void Refresh(Assembly assembly) [EditorBrowsable(EditorBrowsableState.Advanced)] public static Type ComObjectType { - [DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.DefaultConstructor)] + [DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] get => typeof(TypeDescriptorComObject); } diff --git a/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs b/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs index d5a480a8df6448..a5ceca76978962 100644 --- a/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs +++ b/src/libraries/System.ObjectModel/src/System/ComponentModel/TypeDescriptionProviderAttribute.cs @@ -12,7 +12,7 @@ public sealed class TypeDescriptionProviderAttribute : Attribute /// /// Creates a new TypeDescriptionProviderAttribute object. /// - public TypeDescriptionProviderAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.DefaultConstructor)] string typeName) + public TypeDescriptionProviderAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] string typeName) { if (typeName == null) { @@ -25,7 +25,7 @@ public TypeDescriptionProviderAttribute([DynamicallyAccessedMembers(DynamicallyA /// /// Creates a new TypeDescriptionProviderAttribute object. /// - public TypeDescriptionProviderAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.DefaultConstructor)] Type type) + public TypeDescriptionProviderAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type type) { if (type == null) { @@ -39,7 +39,7 @@ public TypeDescriptionProviderAttribute([DynamicallyAccessedMembers(DynamicallyA /// The TypeName property returns the assembly qualified type name /// for the type description provider. /// - [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.DefaultConstructor)] + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] public string TypeName { get; } } } From 664323897fbd28ad72b9974e805f40d190a7c028 Mon Sep 17 00:00:00 2001 From: Layomi Akinrinade Date: Fri, 5 Jun 2020 07:50:15 -0700 Subject: [PATCH 4/4] Fix ComObjectType property annotation --- .../src/System/ComponentModel/TypeDescriptor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs b/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs index be9226173b2642..353bef276e2415 100644 --- a/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs +++ b/src/libraries/System.ComponentModel.TypeConverter/src/System/ComponentModel/TypeDescriptor.cs @@ -2319,7 +2319,7 @@ public static void Refresh(Assembly assembly) [EditorBrowsable(EditorBrowsableState.Advanced)] public static Type ComObjectType { - [DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] + [return: DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] get => typeof(TypeDescriptorComObject); }