From 18efaa016a524a0d70be49d7f1a9fb85f0a23380 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" Date: Fri, 16 Jul 2021 12:15:59 +0000 Subject: [PATCH 1/6] Update dependencies from https://github.com/mono/linker build 20210715.1 Microsoft.NET.ILLink.Tasks From Version 6.0.100-preview.6.21362.3 -> To Version 6.0.100-preview.6.21365.1 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 4e22b844f1bc5..7338e65ced5c1 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -182,9 +182,9 @@ https://github.com/dotnet/runtime 98b7ed1a3b0543a31b5a0f9069cf44cb70c9230c - + https://github.com/mono/linker - 664e78edc72dd0a48e6f55e352051b6ba61bba9a + 9ecf5bd2809f93d98c1dbea640790ca5a88d35ec https://github.com/dotnet/xharness diff --git a/eng/Versions.props b/eng/Versions.props index 49e4c4993dbde..5781dc26aad20 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -165,7 +165,7 @@ 5.0.0-preview-20201009.2 - 6.0.100-preview.6.21362.3 + 6.0.100-preview.6.21365.1 $(MicrosoftNETILLinkTasksVersion) 6.0.0-preview.7.21363.1 From 14accf047b47a9c2e7be8c40f0a8219dde57cd3b Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" Date: Sat, 17 Jul 2021 12:17:09 +0000 Subject: [PATCH 2/6] Update dependencies from https://github.com/mono/linker build 20210716.2 Microsoft.NET.ILLink.Tasks From Version 6.0.100-preview.6.21362.3 -> To Version 6.0.100-preview.6.21366.2 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 7338e65ced5c1..74f57c0daef94 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -182,9 +182,9 @@ https://github.com/dotnet/runtime 98b7ed1a3b0543a31b5a0f9069cf44cb70c9230c - + https://github.com/mono/linker - 9ecf5bd2809f93d98c1dbea640790ca5a88d35ec + 460dd6ddb329a5588d9e4399f4257ce28dfadaca https://github.com/dotnet/xharness diff --git a/eng/Versions.props b/eng/Versions.props index 5781dc26aad20..57cabe2a1a05b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -165,7 +165,7 @@ 5.0.0-preview-20201009.2 - 6.0.100-preview.6.21365.1 + 6.0.100-preview.6.21366.2 $(MicrosoftNETILLinkTasksVersion) 6.0.0-preview.7.21363.1 From f5088c8971e30ccd9a11b2efd8be12930f05c190 Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Mon, 19 Jul 2021 15:26:59 +0000 Subject: [PATCH 3/6] Suppress type hierarchy warnings Suppress type hierarchy warnings for DynamicallyAccessedMembers attribute on types that have members with RequiresUnreferencedCode (or derived types with such members). --- .../System/Data/Common/DbConnectionStringBuilder.cs | 13 +++++++++---- .../System.Data.Common/src/System/Data/DataSet.cs | 6 ++++-- .../System.Data.Common/src/System/Data/DataTable.cs | 6 ++++-- .../src/System/Data/TypedTableBase.cs | 4 ++++ .../Diagnostics/DiagnosticSourceEventSource.cs | 6 ++++++ .../src/System/Diagnostics/Tracing/EventSource.cs | 10 ++++++---- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/libraries/System.Data.Common/src/System/Data/Common/DbConnectionStringBuilder.cs b/src/libraries/System.Data.Common/src/System/Data/Common/DbConnectionStringBuilder.cs index 1b6c5fe1b7eb9..74feebf9a0493 100644 --- a/src/libraries/System.Data.Common/src/System/Data/Common/DbConnectionStringBuilder.cs +++ b/src/libraries/System.Data.Common/src/System/Data/Common/DbConnectionStringBuilder.cs @@ -12,6 +12,11 @@ namespace System.Data.Common { + // This coarse suppression silences all RequiresUnreferencedCode warnings in the class. + // https://github.com/mono/linker/issues/2136 tracks making it possible to add more granular suppressions at the member level, and with a different warning code. + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", + Justification = "The use of GetType preserves members with RequiresUnreferencedCode, but the GetType callsites either " + + "occur in RequiresUnreferencedCode scopes, or have individually justified suppressions.")] [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] public class DbConnectionStringBuilder : IDictionary, ICustomTypeDescriptor { @@ -570,7 +575,7 @@ private PropertyDescriptorCollection GetProperties(Attribute[]? attributes) } [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "The type of component is statically known. This class is marked with [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]")] + Justification = "The component type's class name is preserved because this class is marked with [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]")] string? ICustomTypeDescriptor.GetClassName() { // Below call is necessary to tell the trimmer that it should mark derived types appropriately. @@ -579,7 +584,7 @@ private PropertyDescriptorCollection GetProperties(Attribute[]? attributes) return TypeDescriptor.GetClassName(this, true); } [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "The type of component is statically known. This class is marked with [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]")] + Justification = "The component type's component name is preserved because this class is marked with [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]")] string? ICustomTypeDescriptor.GetComponentName() { // Below call is necessary to tell the trimmer that it should mark derived types appropriately. @@ -588,7 +593,7 @@ private PropertyDescriptorCollection GetProperties(Attribute[]? attributes) return TypeDescriptor.GetComponentName(this, true); } [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "The type of component is statically known. This class is marked with [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]")] + Justification = "The component type's attributes are preserved because this class is marked with [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]")] AttributeCollection ICustomTypeDescriptor.GetAttributes() { return TypeDescriptor.GetAttributes(this, true); @@ -624,7 +629,7 @@ PropertyDescriptorCollection ICustomTypeDescriptor.GetProperties(Attribute[]? at return TypeDescriptor.GetDefaultEvent(this, true); } [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "The type of component is statically known. This class is marked with [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]")] + Justification = "The component type's events are preserved because this class is marked with [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)]")] EventDescriptorCollection ICustomTypeDescriptor.GetEvents() { // Below call is necessary to tell the trimmer that it should mark derived types appropriately. diff --git a/src/libraries/System.Data.Common/src/System/Data/DataSet.cs b/src/libraries/System.Data.Common/src/System/Data/DataSet.cs index 6974aafce602c..962ba8131b853 100644 --- a/src/libraries/System.Data.Common/src/System/Data/DataSet.cs +++ b/src/libraries/System.Data.Common/src/System/Data/DataSet.cs @@ -30,6 +30,10 @@ namespace System.Data [XmlSchemaProvider(nameof(GetDataSetSchema))] [XmlRoot(nameof(DataSet))] [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] + // This coarse suppression silences all RequiresUnreferencedCode warnings in the class. + // https://github.com/mono/linker/issues/2136 tracks making it possible to add more granular suppressions at the member level, and with a different warning code. + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", + Justification = "CreateInstanceOfThisType's use of GetType uses only the parameterless constructor, but the annotations preserve all non-public constructors causing a warning for the serialization constructors. Those constructors won't be used here.")] [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.NonPublicConstructors)] // needed by Clone() to preserve derived ctors public class DataSet : MarshalByValueComponent, IListSource, IXmlSerializable, ISupportInitializeNotification, ISerializable { @@ -1093,8 +1097,6 @@ public void Clear() } } - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "Only parameterless constructors are used here but since nonPublic=true, all non-public constructors are being preserved causing a warning for the serialization constructors. Those constructors won't be used here.")] private DataSet CreateInstanceOfThisType() { return (DataSet)Activator.CreateInstance(GetType(), true)!; diff --git a/src/libraries/System.Data.Common/src/System/Data/DataTable.cs b/src/libraries/System.Data.Common/src/System/Data/DataTable.cs index 22ace6fce6404..ad9044bd4a907 100644 --- a/src/libraries/System.Data.Common/src/System/Data/DataTable.cs +++ b/src/libraries/System.Data.Common/src/System/Data/DataTable.cs @@ -31,6 +31,10 @@ namespace System.Data [XmlSchemaProvider(nameof(GetDataTableSchema))] [Serializable] [System.Runtime.CompilerServices.TypeForwardedFrom("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] + // This coarse suppression silences all RequiresUnreferencedCode warnings in the class. + // https://github.com/mono/linker/issues/2136 tracks making it possible to add more granular suppressions at the member level, and with a different warning code. + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", + Justification = "CreateInstance's use of GetType uses only the parameterless constructor. Warnings are about serialization related constructors.")] [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.NonPublicConstructors)] public class DataTable : MarshalByValueComponent, IListSource, ISupportInitializeNotification, ISerializable, IXmlSerializable { @@ -2307,8 +2311,6 @@ public void AcceptChanges() // Prevent inlining so that reflection calls are not moved to caller that may be in a different assembly that may have a different grant set. [MethodImpl(MethodImplOptions.NoInlining)] - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "Only parameterless constructors are used here. Warning is about serialization related constructors.")] protected virtual DataTable CreateInstance() => (DataTable)Activator.CreateInstance(GetType(), true)!; public virtual DataTable Clone() => Clone(null); diff --git a/src/libraries/System.Data.Common/src/System/Data/TypedTableBase.cs b/src/libraries/System.Data.Common/src/System/Data/TypedTableBase.cs index 5c66f68859545..64fdf03878571 100644 --- a/src/libraries/System.Data.Common/src/System/Data/TypedTableBase.cs +++ b/src/libraries/System.Data.Common/src/System/Data/TypedTableBase.cs @@ -12,6 +12,10 @@ namespace System.Data /// This is the generic base class for TypedDataSet /// [Serializable] + // This coarse suppression silences all RequiresUnreferencedCode warnings in the class. + // https://github.com/mono/linker/issues/2136 tracks making it possible to add more granular suppressions at the member level, and with a different warning code. + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", + Justification = "DataTable.CreateInstance's use of GetType uses only the parameterless constructor. Warnings are about serialization related constructors.")] public abstract class TypedTableBase : DataTable, IEnumerable where T : DataRow { diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs index d2ee34fe439d9..83dcd31583526 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs @@ -160,6 +160,12 @@ namespace System.Diagnostics /// See the DiagnosticSourceEventSourceBridgeTest.cs for more explicit examples of using this bridge. /// [EventSource(Name = "Microsoft-Diagnostics-DiagnosticSource")] + // This coarse suppression silences all RequiresUnreferencedCode warnings in the class. + // https://github.com/mono/linker/issues/2136 tracks making it possible to add more granular suppressions at the member level, and with a different warning code. + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", + Justification = "In EventSource, GetCreateManifestAndDescriptorsViaLocalMethod's use of GetType uses preverves all members, so " + + "those that are marked with RequiresUnreferencedCode will warn. " + + "This method will not access any of these members and is safe to call.")] internal sealed class DiagnosticSourceEventSource : EventSource { public static DiagnosticSourceEventSource Log = new DiagnosticSourceEventSource(); diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs index 4800a2cde4736..40977ed0520f4 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs @@ -233,6 +233,12 @@ internal sealed class EventSourceAutoGenerateAttribute : Attribute // The EnsureDescriptorsInitialized() method might need to access EventSource and its derived type // members and the trimmer ensures that these members are preserved. [DynamicallyAccessedMembers(ManifestMemberTypes)] + // This coarse suppression silences all RequiresUnreferencedCode warnings in the class. + // https://github.com/mono/linker/issues/2136 tracks making it possible to add more granular suppressions at the member level, and with a different warning code. + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", + Justification = "GetCreateManifestAndDescriptorsViaLocalMethod's use of GetType uses preverves all members, so " + + "those that are marked with RequiresUnreferencedCode will warn. " + + "This method will not access any of these members and is safe to call.")] #endif public partial class EventSource : IDisposable { @@ -2814,10 +2820,6 @@ private void EnsureDescriptorsInitialized() // get the metadata via reflection. Debug.Assert(m_rawManifest == null); #if !ES_BUILD_STANDALONE - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "Based on the annotation on EventSource class, Trimmer will see from its analysis members " + - "that are marked with RequiresUnreferencedCode and will warn." + - "This method will not access any of these members and is safe to call.")] byte[]? GetCreateManifestAndDescriptorsViaLocalMethod(string name) => CreateManifestAndDescriptors(this.GetType(), name, this); m_rawManifest = GetCreateManifestAndDescriptorsViaLocalMethod(Name); #else From e5ba222580769415e92d4a24d976125c3291ab93 Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Mon, 19 Jul 2021 21:29:24 +0000 Subject: [PATCH 4/6] Feedback Remove unnecessary local method --- .../src/System/Diagnostics/DiagnosticSourceEventSource.cs | 2 +- .../src/System/Diagnostics/Tracing/EventSource.cs | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs index 83dcd31583526..73d7ef7641849 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs @@ -163,7 +163,7 @@ namespace System.Diagnostics // This coarse suppression silences all RequiresUnreferencedCode warnings in the class. // https://github.com/mono/linker/issues/2136 tracks making it possible to add more granular suppressions at the member level, and with a different warning code. [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "In EventSource, GetCreateManifestAndDescriptorsViaLocalMethod's use of GetType uses preverves all members, so " + + Justification = "In EventSource, EnsureDescriptorsInitialized's use of GetType preverves all members, so " + "those that are marked with RequiresUnreferencedCode will warn. " + "This method will not access any of these members and is safe to call.")] internal sealed class DiagnosticSourceEventSource : EventSource diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs index 40977ed0520f4..2efee16c99b83 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs @@ -236,7 +236,7 @@ internal sealed class EventSourceAutoGenerateAttribute : Attribute // This coarse suppression silences all RequiresUnreferencedCode warnings in the class. // https://github.com/mono/linker/issues/2136 tracks making it possible to add more granular suppressions at the member level, and with a different warning code. [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "GetCreateManifestAndDescriptorsViaLocalMethod's use of GetType uses preverves all members, so " + + Justification = "EnsureDescriptorsInitialized's use of GetType preverves all members, so " + "those that are marked with RequiresUnreferencedCode will warn. " + "This method will not access any of these members and is safe to call.")] #endif @@ -2819,12 +2819,7 @@ private void EnsureDescriptorsInitialized() { // get the metadata via reflection. Debug.Assert(m_rawManifest == null); -#if !ES_BUILD_STANDALONE - byte[]? GetCreateManifestAndDescriptorsViaLocalMethod(string name) => CreateManifestAndDescriptors(this.GetType(), name, this); - m_rawManifest = GetCreateManifestAndDescriptorsViaLocalMethod(Name); -#else m_rawManifest = CreateManifestAndDescriptors(this.GetType(), Name, this); -#endif Debug.Assert(m_eventData != null); // TODO Enforce singleton pattern From d23983172ab321de196dafae681cab50ff033645 Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Mon, 19 Jul 2021 21:31:22 +0000 Subject: [PATCH 5/6] Fix typo --- .../src/System/Diagnostics/DiagnosticSourceEventSource.cs | 2 +- .../src/System/Diagnostics/Tracing/EventSource.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs index 73d7ef7641849..31daa2a57eb5f 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/DiagnosticSourceEventSource.cs @@ -163,7 +163,7 @@ namespace System.Diagnostics // This coarse suppression silences all RequiresUnreferencedCode warnings in the class. // https://github.com/mono/linker/issues/2136 tracks making it possible to add more granular suppressions at the member level, and with a different warning code. [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "In EventSource, EnsureDescriptorsInitialized's use of GetType preverves all members, so " + + Justification = "In EventSource, EnsureDescriptorsInitialized's use of GetType preserves all members, so " + "those that are marked with RequiresUnreferencedCode will warn. " + "This method will not access any of these members and is safe to call.")] internal sealed class DiagnosticSourceEventSource : EventSource diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs index 2efee16c99b83..87d09e16679ed 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs @@ -236,7 +236,7 @@ internal sealed class EventSourceAutoGenerateAttribute : Attribute // This coarse suppression silences all RequiresUnreferencedCode warnings in the class. // https://github.com/mono/linker/issues/2136 tracks making it possible to add more granular suppressions at the member level, and with a different warning code. [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", - Justification = "EnsureDescriptorsInitialized's use of GetType preverves all members, so " + + Justification = "EnsureDescriptorsInitialized's use of GetType preserves all members, so " + "those that are marked with RequiresUnreferencedCode will warn. " + "This method will not access any of these members and is safe to call.")] #endif From a317a25497c4708e9ea9aaccab7795f67b0734c8 Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" Date: Tue, 20 Jul 2021 12:18:03 +0000 Subject: [PATCH 6/6] Update dependencies from https://github.com/mono/linker build 20210719.3 Microsoft.NET.ILLink.Tasks From Version 6.0.100-preview.6.21362.3 -> To Version 6.0.100-preview.6.21369.3 --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 74f57c0daef94..d53c385b5da81 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -182,9 +182,9 @@ https://github.com/dotnet/runtime 98b7ed1a3b0543a31b5a0f9069cf44cb70c9230c - + https://github.com/mono/linker - 460dd6ddb329a5588d9e4399f4257ce28dfadaca + 8d49e169d872d6225bcf73ae14ae50b002f39319 https://github.com/dotnet/xharness diff --git a/eng/Versions.props b/eng/Versions.props index 57cabe2a1a05b..d813d5c21d02b 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -165,7 +165,7 @@ 5.0.0-preview-20201009.2 - 6.0.100-preview.6.21366.2 + 6.0.100-preview.6.21369.3 $(MicrosoftNETILLinkTasksVersion) 6.0.0-preview.7.21363.1