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..73e810d043a21d --- /dev/null +++ b/src/libraries/System.Runtime/tests/System.Runtime.Tests/TrimmingTests/MetadataUpdateHandlerTrimmed.cs @@ -0,0 +1,64 @@ +// 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.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); + + // 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", + "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 +