From 8018fac31a6b861cc1f0481ae5c8c455c224068d Mon Sep 17 00:00:00 2001 From: pavelsavara Date: Thu, 26 Mar 2026 08:54:28 +0100 Subject: [PATCH 1/3] trim feature attributes in all assemblies --- .../ILLink/ILLink.LinkAttributes.Shared.xml | 8 +-- .../MetadataUpdateHandlerTrimmed.cs | 67 +++++++++++++++++++ .../System.Runtime.TrimmingTests.proj | 3 + 3 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs diff --git a/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.LinkAttributes.Shared.xml b/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.LinkAttributes.Shared.xml index c13bff30f490c4..9d685c4828e9ea 100644 --- a/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.LinkAttributes.Shared.xml +++ b/src/libraries/System.Private.CoreLib/src/ILLink/ILLink.LinkAttributes.Shared.xml @@ -12,7 +12,7 @@ - + @@ -42,13 +42,13 @@ - + - + @@ -70,7 +70,7 @@ - + diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs b/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs new file mode 100644 index 00000000000000..a4be32f96eec8c --- /dev/null +++ b/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs @@ -0,0 +1,67 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Linq; +using System.Reflection; +using System.Reflection.Metadata; + +/// +/// Tests that when MetadataUpdater.IsSupported is false, the MetadataUpdateHandlerAttribute +/// instances and the handler types they reference are trimmed from all assemblies. +/// +class Program +{ + static int Main(string[] args) + { + // Hard references to ensure these assemblies are loaded and not entirely removed by the trimmer. + // We use types that the trimmer cannot remove (public API surface). + _ = typeof(System.ComponentModel.TypeConverter); + _ = typeof(System.Text.Json.JsonSerializer); + _ = typeof(Microsoft.Extensions.DependencyInjection.ActivatorUtilities); + + // MetadataUpdater.IsSupported should be false + if (MetadataUpdater.IsSupported) + { + Console.WriteLine("Failed: MetadataUpdater.IsSupported should be false"); + return -1; + } + + // Verify MetadataUpdateHandlerAttribute is not present on any assembly + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + foreach (var attr in assembly.GetCustomAttributesData()) + { + if (attr.AttributeType.Name == "MetadataUpdateHandlerAttribute") + { + Console.WriteLine($"Failed: {assembly.GetName().Name} still has MetadataUpdateHandlerAttribute"); + return -1; + } + } + } + + // Verify the handler types themselves are trimmed + string[] handlerTypeNames = new[] + { + "System.Reflection.Metadata.RuntimeTypeMetadataUpdateHandler", + "Microsoft.Extensions.DependencyInjection.ActivatorUtilities+ActivatorUtilitiesUpdateHandler", + "System.ComponentModel.ReflectionCachesUpdateHandler", + "System.Text.Json.JsonSerializerOptionsUpdateHandler", + }; + + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + foreach (var typeName in handlerTypeNames) + { + var type = assembly.GetType(typeName); + if (type != null) + { + Console.WriteLine($"Failed: {assembly.GetName().Name} still contains {typeName}"); + return -1; + } + } + } + + return 100; + } +} diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/System.Runtime.TrimmingTests.proj b/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/System.Runtime.TrimmingTests.proj index 31e6d7814c97bd..2f9b7db435bc06 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/System.Runtime.TrimmingTests.proj +++ b/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/System.Runtime.TrimmingTests.proj @@ -70,6 +70,9 @@ true + + System.Reflection.Metadata.MetadataUpdater.IsSupported + From a5b78e48b41dac1a076f2ebbab96690ffde506aa Mon Sep 17 00:00:00 2001 From: pavelsavara Date: Thu, 26 Mar 2026 09:45:11 +0100 Subject: [PATCH 2/3] fix test --- .../TrimmingTests/MetadataUpdateHandlerTrimmed.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs b/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs index a4be32f96eec8c..f1983fa59fdc86 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs +++ b/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs @@ -18,7 +18,6 @@ static int Main(string[] args) // We use types that the trimmer cannot remove (public API surface). _ = typeof(System.ComponentModel.TypeConverter); _ = typeof(System.Text.Json.JsonSerializer); - _ = typeof(Microsoft.Extensions.DependencyInjection.ActivatorUtilities); // MetadataUpdater.IsSupported should be false if (MetadataUpdater.IsSupported) @@ -44,7 +43,6 @@ static int Main(string[] args) string[] handlerTypeNames = new[] { "System.Reflection.Metadata.RuntimeTypeMetadataUpdateHandler", - "Microsoft.Extensions.DependencyInjection.ActivatorUtilities+ActivatorUtilitiesUpdateHandler", "System.ComponentModel.ReflectionCachesUpdateHandler", "System.Text.Json.JsonSerializerOptionsUpdateHandler", }; From ec0d75a0fbc95cb645fc2faefe21c1708470e529 Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Tue, 31 Mar 2026 12:06:51 +0200 Subject: [PATCH 3/3] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../TrimmingTests/MetadataUpdateHandlerTrimmed.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs b/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs index f1983fa59fdc86..73e810d043a21d 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs +++ b/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs @@ -2,7 +2,6 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; -using System.Linq; using System.Reflection; using System.Reflection.Metadata;