diff --git a/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs b/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs index c02b0f29a8aa..c6ac195d3e6e 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs @@ -803,6 +803,7 @@ public partial interface IAzureClientFactoryBuilder } public partial interface IAzureClientFactoryBuilderWithConfiguration : Azure.Core.Extensions.IAzureClientFactoryBuilder { + [System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] Azure.Core.Extensions.IAzureClientBuilder RegisterClientFactory(TConfiguration configuration) where TOptions : class; } public partial interface IAzureClientFactoryBuilderWithCredential diff --git a/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilder.cs b/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilder.cs index 3e7fbeda0d0b..8b480b55db2c 100644 --- a/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilder.cs +++ b/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilder.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using System.Diagnostics.CodeAnalysis; namespace Azure.Core.Extensions { @@ -17,6 +18,6 @@ public interface IAzureClientFactoryBuilder /// The client options type used the client. /// The factory, that given the instance of options, returns a client instance. /// that allows customizing the client registration. - IAzureClientBuilder RegisterClientFactory(Func clientFactory) where TOptions : class; + IAzureClientBuilder RegisterClientFactory(Func clientFactory) where TOptions : class; } } diff --git a/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilderWithConfiguration.cs b/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilderWithConfiguration.cs index b98e448cb579..9c4658d47387 100644 --- a/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilderWithConfiguration.cs +++ b/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilderWithConfiguration.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System.Diagnostics.CodeAnalysis; + namespace Azure.Core.Extensions { /// @@ -15,6 +17,8 @@ public interface IAzureClientFactoryBuilderWithConfiguration /// The client options type used the client. /// Instance of to use. /// that allows customizing the client registration. - IAzureClientBuilder RegisterClientFactory(TConfiguration configuration) where TOptions : class; + [RequiresUnreferencedCode("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + [RequiresDynamicCode("Binding strongly typed objects to configuration values requires generating dynamic code at runtime, for example instantiating generic types. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + IAzureClientBuilder RegisterClientFactory<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TOptions>(TConfiguration configuration) where TOptions : class; } } diff --git a/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilderWithCredential.cs b/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilderWithCredential.cs index bdf3848e762e..6b87ad3d34ce 100644 --- a/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilderWithCredential.cs +++ b/sdk/core/Azure.Core/src/Extensions/IAzureClientFactoryBuilderWithCredential.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using System.Diagnostics.CodeAnalysis; namespace Azure.Core.Extensions { @@ -18,6 +19,6 @@ public interface IAzureClientFactoryBuilderWithCredential /// The factory, that given the instance of options and credential, returns a client instance. /// Specifies whether the credential is optional (client supports anonymous authentication). /// that allows customizing the client registration. - IAzureClientBuilder RegisterClientFactory(Func clientFactory, bool requiresCredential = true) where TOptions : class; + IAzureClientBuilder RegisterClientFactory(Func clientFactory, bool requiresCredential = true) where TOptions : class; } } diff --git a/sdk/extensions/Microsoft.Extensions.Azure/src/AzureClientBuilderExtensions.cs b/sdk/extensions/Microsoft.Extensions.Azure/src/AzureClientBuilderExtensions.cs index df6c45121ad6..ff234b3f6a01 100644 --- a/sdk/extensions/Microsoft.Extensions.Azure/src/AzureClientBuilderExtensions.cs +++ b/sdk/extensions/Microsoft.Extensions.Azure/src/AzureClientBuilderExtensions.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using System; +using System.Diagnostics.CodeAnalysis; namespace Microsoft.Extensions.Azure { @@ -78,6 +79,8 @@ public static IAzureClientBuilder ConfigureOptionsThe client builder instance. /// The configuration instance to use. /// The client builder instance. + [RequiresUnreferencedCode("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + [RequiresDynamicCode("Binding strongly typed objects to configuration values requires generating dynamic code at runtime, for example instantiating generic types. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] public static IAzureClientBuilder ConfigureOptions(this IAzureClientBuilder builder, IConfiguration configuration) where TOptions : class { return builder.ConfigureOptions(options => configuration.Bind(options)); diff --git a/sdk/extensions/Microsoft.Extensions.Azure/src/AzureClientFactoryBuilder.cs b/sdk/extensions/Microsoft.Extensions.Azure/src/AzureClientFactoryBuilder.cs index 29edcbf2b7e4..a38576ad9cf9 100644 --- a/sdk/extensions/Microsoft.Extensions.Azure/src/AzureClientFactoryBuilder.cs +++ b/sdk/extensions/Microsoft.Extensions.Azure/src/AzureClientFactoryBuilder.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using System.Diagnostics.CodeAnalysis; using Azure.Core; using Azure.Core.Extensions; using Microsoft.Extensions.Configuration; @@ -25,12 +26,16 @@ internal AzureClientFactoryBuilder(IServiceCollection serviceCollection) _serviceCollection = serviceCollection; } - IAzureClientBuilder IAzureClientFactoryBuilder.RegisterClientFactory(Func clientFactory) + IAzureClientBuilder IAzureClientFactoryBuilder.RegisterClientFactory( + Func clientFactory) { return ((IAzureClientFactoryBuilderWithCredential)this).RegisterClientFactory((options, _) => clientFactory(options)); } - IAzureClientBuilder IAzureClientFactoryBuilderWithConfiguration.RegisterClientFactory(IConfiguration configuration) + [RequiresUnreferencedCode("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + [RequiresDynamicCode("Binding strongly typed objects to configuration values requires generating dynamic code at runtime, for example instantiating generic types. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + IAzureClientBuilder IAzureClientFactoryBuilderWithConfiguration.RegisterClientFactory<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TOptions>( + IConfiguration configuration) { var credentialsFromConfig = ClientFactory.CreateCredential(configuration); var clientBuilder =((IAzureClientFactoryBuilderWithCredential)this).RegisterClientFactory( @@ -73,6 +78,8 @@ public AzureClientFactoryBuilder ConfigureDefaults(Action /// The configuration instance. /// This instance. + [RequiresUnreferencedCode("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + [RequiresDynamicCode("Binding strongly typed objects to configuration values requires generating dynamic code at runtime, for example instantiating generic types. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] public AzureClientFactoryBuilder ConfigureDefaults(IConfiguration configuration) { ConfigureDefaults(configuration.Bind); @@ -87,7 +94,8 @@ public AzureClientFactoryBuilder ConfigureDefaults(IConfiguration configuration) return this; } - IAzureClientBuilder IAzureClientFactoryBuilderWithCredential.RegisterClientFactory(Func clientFactory, bool requiresCredential) + IAzureClientBuilder IAzureClientFactoryBuilderWithCredential.RegisterClientFactory( + Func clientFactory, bool requiresCredential) { return RegisterClientFactory((options, credential, _) => clientFactory(options, credential), requiresCredential); } @@ -119,7 +127,9 @@ public AzureClientFactoryBuilder UseCredential(FuncThe type of the client. /// The type of the client options. /// The to allow client configuration. - public IAzureClientBuilder AddClient(Func factory) where TOptions : class + public IAzureClientBuilder AddClient( + Func factory) + where TOptions : class { return RegisterClientFactory((options, _, _) => factory(options), false); } @@ -130,7 +140,9 @@ public IAzureClientBuilder AddClient(Func< /// The type of the client. /// The type of the client options. /// The to allow client configuration. - public IAzureClientBuilder AddClient(Func factory) where TOptions : class + public IAzureClientBuilder AddClient( + Func factory) + where TOptions : class { return RegisterClientFactory((options, credential, _) => factory(options, credential), true); } @@ -142,7 +154,9 @@ public IAzureClientBuilder AddClient(Func< /// The type of the client. /// The type of the client options. /// The to allow client configuration. - public IAzureClientBuilder AddClient(Func factory) where TOptions : class + public IAzureClientBuilder AddClient( + Func factory) + where TOptions : class { return RegisterClientFactory((options, _, provider) => factory(options, provider), true); } @@ -154,12 +168,17 @@ public IAzureClientBuilder AddClient(Func< /// The type of the client. /// The type of the client options. /// The to allow client configuration. - public IAzureClientBuilder AddClient(Func factory) where TOptions : class + public IAzureClientBuilder AddClient( + Func factory) + where TOptions : class { return RegisterClientFactory((options, credential, provider) => factory(options, credential, provider), true); } - private IAzureClientBuilder RegisterClientFactory(Func clientFactory, bool requiresCredential) where TOptions : class + private IAzureClientBuilder RegisterClientFactory( + Func clientFactory, + bool requiresCredential) + where TOptions : class { var clientRegistration = new ClientRegistration(DefaultClientName, requiresCredential, (provider, options, credential) => clientFactory((TOptions) options, credential, provider)); _serviceCollection.AddSingleton(clientRegistration); diff --git a/sdk/extensions/Microsoft.Extensions.Azure/src/AzureComponentFactory.cs b/sdk/extensions/Microsoft.Extensions.Azure/src/AzureComponentFactory.cs index b8b9fcb54a41..86a4e5b09912 100644 --- a/sdk/extensions/Microsoft.Extensions.Azure/src/AzureComponentFactory.cs +++ b/sdk/extensions/Microsoft.Extensions.Azure/src/AzureComponentFactory.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using System.Diagnostics.CodeAnalysis; using Azure.Core; using Microsoft.Extensions.Configuration; @@ -24,7 +25,12 @@ public abstract class AzureComponentFactory /// The value of ServiceVersion enum to use, null to use the default. /// The instance to apply to options. /// A new instance of . - public abstract object CreateClientOptions(Type optionsType, object serviceVersion, IConfiguration configuration); + [RequiresUnreferencedCode("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + [RequiresDynamicCode("Binding strongly typed objects to configuration values requires generating dynamic code at runtime, for example instantiating generic types. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + public abstract object CreateClientOptions( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type optionsType, + object serviceVersion, + IConfiguration configuration); /// /// Creates a new client instance using the provided configuration to map constructor parameters from. @@ -35,6 +41,11 @@ public abstract class AzureComponentFactory /// The object to use if required by constructor, if null no . /// The client /// - public abstract object CreateClient(Type clientType, IConfiguration configuration, TokenCredential credential, object clientOptions); + [RequiresUnreferencedCode("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + public abstract object CreateClient( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type clientType, + IConfiguration configuration, + TokenCredential credential, + object clientOptions); } } \ No newline at end of file diff --git a/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/AzureClientFactory.cs b/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/AzureClientFactory.cs index f278412906ab..0c1ff1fb8e53 100644 --- a/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/AzureClientFactory.cs +++ b/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/AzureClientFactory.cs @@ -3,12 +3,14 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; using Microsoft.Extensions.Options; namespace Microsoft.Extensions.Azure { - internal class AzureClientFactory: IAzureClientFactory, IDisposable, IAsyncDisposable + internal class AzureClientFactory + : IAzureClientFactory, IDisposable, IAsyncDisposable { private readonly Dictionary> _clientRegistrations; diff --git a/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/AzureComponentFactoryImpl.cs b/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/AzureComponentFactoryImpl.cs index 7f24ad14bef6..5d423e83072d 100644 --- a/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/AzureComponentFactoryImpl.cs +++ b/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/AzureComponentFactoryImpl.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using System.Diagnostics.CodeAnalysis; using Azure.Core; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; @@ -25,7 +26,12 @@ public override TokenCredential CreateTokenCredential(IConfiguration configurati return ClientFactory.CreateCredential(configuration) ?? _globalOptions.CurrentValue.CredentialFactory(_serviceProvider); } - public override object CreateClientOptions(Type optionsType, object serviceVersion, IConfiguration configuration) + [RequiresUnreferencedCode("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + [RequiresDynamicCode("Binding strongly typed objects to configuration values requires generating dynamic code at runtime, for example instantiating generic types. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + public override object CreateClientOptions( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type optionsType, + object serviceVersion, + IConfiguration configuration) { if (optionsType == null) throw new ArgumentNullException(nameof(optionsType)); var options = ClientFactory.CreateClientOptions(serviceVersion, optionsType); @@ -41,7 +47,12 @@ public override object CreateClientOptions(Type optionsType, object serviceVersi return options; } - public override object CreateClient(Type clientType, IConfiguration configuration, TokenCredential credential, object clientOptions) + [RequiresUnreferencedCode("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + public override object CreateClient( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type clientType, + IConfiguration configuration, + TokenCredential credential, + object clientOptions) { if (clientType == null) throw new ArgumentNullException(nameof(clientType)); if (configuration == null) throw new ArgumentNullException(nameof(configuration)); diff --git a/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientFactory.cs b/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientFactory.cs index a44d61cc6a23..0646bb2d3fcd 100644 --- a/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientFactory.cs +++ b/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientFactory.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Security.Cryptography.X509Certificates; @@ -19,7 +20,13 @@ internal static class ClientFactory private const string ConnectionStringParameterName = "connectionString"; private const char TenantDelimiter = ';'; - public static object CreateClient(Type clientType, Type optionsType, object options, IConfiguration configuration, TokenCredential credential) + [RequiresUnreferencedCode("Binding strongly typed objects to configuration values is not supported with trimming. Use the Configuration Binder Source Generator (EnableConfigurationBindingGenerator=true) instead.")] + public static object CreateClient( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type clientType, + Type optionsType, + object options, + IConfiguration configuration, + TokenCredential credential) { List arguments = new List(); // Handle single values as connection strings @@ -243,7 +250,9 @@ internal static TokenCredential CreateCredential(IConfiguration configuration) return null; } - internal static object CreateClientOptions(object version, Type optionsType) + internal static object CreateClientOptions( + object version, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type optionsType) { ConstructorInfo parameterlessConstructor = null; int versionParameterIndex = 0; @@ -320,7 +329,11 @@ private static bool IsOptionsParameter(ParameterInfo parameter, Type optionsType parameter.Position == ((ConstructorInfo)parameter.Member).GetParameters().Length - 1; } - private static string BuildErrorMessage(IConfiguration configuration, Type clientType, Type optionsType) + [RequiresUnreferencedCode("Walks the constructors of the type's constructor parameters, which can't be annotated for trimming.")] + private static string BuildErrorMessage( + IConfiguration configuration, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type clientType, + Type optionsType) { var builder = new StringBuilder(); @@ -410,7 +423,12 @@ private static bool IsApplicableConstructor(ConstructorInfo constructorInfo, Typ IsOptionsParameter(parameters[parameters.Length - 1], optionsType); } - private static bool TryConvertArgument(IConfiguration configuration, string parameterName, Type parameterType, out object value) + [RequiresUnreferencedCode("Recursively walks the constructors of parameterType's constructor parameters, which can't be annotated for trimming.")] + private static bool TryConvertArgument( + IConfiguration configuration, + string parameterName, + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type parameterType, + out object value) { if (parameterType == typeof(string)) { @@ -443,7 +461,11 @@ private static bool TryConvertFromString(IConfiguration configuration, string pa return true; } - internal static bool TryCreateObject(Type type, IConfigurationSection configuration, out object value) + [RequiresUnreferencedCode("Recursively walks the constructors of the type's constructor parameters, which can't be annotated for trimming.")] + internal static bool TryCreateObject( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type, + IConfigurationSection configuration, + out object value) { if (!configuration.GetChildren().Any()) { @@ -481,7 +503,8 @@ internal static bool TryCreateObject(Type type, IConfigurationSection configurat return false; } - private static IOrderedEnumerable GetApplicableParameterConstructors(Type type) + private static IOrderedEnumerable GetApplicableParameterConstructors( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type type) { return type.GetConstructors(BindingFlags.Public | BindingFlags.Instance).OrderByDescending(c => c.GetParameters().Length); } diff --git a/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientOptionsFactory.cs b/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientOptionsFactory.cs index fe5f353ecda2..9309a68ac390 100644 --- a/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientOptionsFactory.cs +++ b/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientOptionsFactory.cs @@ -3,13 +3,15 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using Azure.Core; using Microsoft.Extensions.Options; namespace Microsoft.Extensions.Azure { // Slightly adjusted copy of https://github.com/aspnet/Extensions/blob/master/src/Options/Options/src/OptionsFactory.cs - internal class ClientOptionsFactory: IClientOptionsFactory where TOptions : class + internal class ClientOptionsFactory + : IClientOptionsFactory where TOptions : class { private readonly IEnumerable> _setups; private readonly IEnumerable> _postConfigures; diff --git a/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientOptionsMonitor.cs b/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientOptionsMonitor.cs index 5c65fff03594..df741d0ebfb0 100644 --- a/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientOptionsMonitor.cs +++ b/sdk/extensions/Microsoft.Extensions.Azure/src/Internal/ClientOptionsMonitor.cs @@ -3,13 +3,15 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Options; using Microsoft.Extensions.Primitives; namespace Microsoft.Extensions.Azure { // Slightly adjusted copy of https://github.com/aspnet/Extensions/blob/master/src/Options/Options/src/OptionsMonitor.cs - internal class ClientOptionsMonitor : IOptionsMonitor, IDisposable where TOptions : class + internal class ClientOptionsMonitor + : IOptionsMonitor, IDisposable where TOptions : class { private readonly IOptionsMonitorCache _cache; private readonly ClientOptionsFactory _factory; diff --git a/sdk/extensions/Microsoft.Extensions.Azure/src/Microsoft.Extensions.Azure.csproj b/sdk/extensions/Microsoft.Extensions.Azure/src/Microsoft.Extensions.Azure.csproj index ec2493398978..0c90f4a9c637 100644 --- a/sdk/extensions/Microsoft.Extensions.Azure/src/Microsoft.Extensions.Azure.csproj +++ b/sdk/extensions/Microsoft.Extensions.Azure/src/Microsoft.Extensions.Azure.csproj @@ -28,6 +28,7 @@ - + + diff --git a/sdk/extensions/Microsoft.Extensions.Azure/tests/compatibility/ExpectedAotWarnings.txt b/sdk/extensions/Microsoft.Extensions.Azure/tests/compatibility/ExpectedAotWarnings.txt new file mode 100644 index 000000000000..685f2a5390ba --- /dev/null +++ b/sdk/extensions/Microsoft.Extensions.Azure/tests/compatibility/ExpectedAotWarnings.txt @@ -0,0 +1,14 @@ +AzureClientFactoryBuilder\.cs\(\d*\): Trim analysis warning IL2026: Microsoft\.Extensions\.Azure\.AzureClientFactoryBuilder\.\<\>c__DisplayClass\d*_\d*`2\.\\.RegisterClientFactory\>b__\d*\(!1,TokenCredential\): Using member 'Microsoft\.Extensions\.Azure\.ClientFactory\.CreateClient\(Type,Type,Object,IConfiguration,TokenCredential\)' which has 'RequiresUnreferencedCodeAttribute' +BinaryExpression\.cs\(\d*\): AOT analysis warning IL3050: System\.Linq\.Expressions\.Expression\.GetResultTypeOfShift\(Type,Type\): Using member 'System\.Type\.MakeGenericType\(Type\[\]\)' which has 'RequiresDynamicCodeAttribute' +TypeUtils\.cs\(\d*\): AOT analysis warning IL3050: System\.Dynamic\.Utils\.TypeUtils\.GetNullableType\(Type\): Using member 'System\.Type\.MakeGenericType\(Type\[\]\)' which has 'RequiresDynamicCodeAttribute' +ContentValidator\.cs\(\d*\): AOT analysis warning IL3050: System\.Xml\.Schema\.ParticleContentValidator\.BuildTransitionTable\(BitSet,BitSet\[\],Int32\): Using member 'System\.Collections\.ArrayList\.ToArray\(Type\)' which has 'RequiresDynamicCodeAttribute' +DataTypeImplementation\.cs\(\d*\): AOT analysis warning IL3050: System\.Xml\.Schema\.Datatype_List\.TryParseValue\(String,XmlNameTable,IXmlNamespaceResolver,Object&\): Using member 'System\.Collections\.ArrayList\.ToArray\(Type\)' which has 'RequiresDynamicCodeAttribute' +DataTypeImplementation\.cs\(\d*\): AOT analysis warning IL3050: System\.Xml\.Schema\.Datatype_List\.TryParseValue\(String,XmlNameTable,IXmlNamespaceResolver,Object&\): Using member 'System\.Collections\.ArrayList\.ToArray\(Type\)' which has 'RequiresDynamicCodeAttribute' +XmlValueConverter\.cs\(\d*\): AOT analysis warning IL3050: System\.Xml\.Schema\.XmlBaseConverter\.XmlBaseConverter\(XmlBaseConverter\): Using member 'System\.Array\.CreateInstance\(Type,Int32\)' which has 'RequiresDynamicCodeAttribute' +ILC : AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.Dispose\(\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +ILC : AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.Dispose\(\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +ILC : AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.MarkFailed\(!!0,String\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +ILC : AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.MarkFailed\(!!0,String\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +ILC : AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.WriteStartEvent\(\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +ILC : AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.WriteStartEvent\(\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +System\.Net\.Http.src.System.Net.Http.DiagnosticsHandler\.cs\(\d*\): AOT analysis warning IL3050: System\.Net\.Http\.DiagnosticsHandler\.Write\(DiagnosticSource,String,!!0\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' \ No newline at end of file diff --git a/sdk/extensions/ci.yml b/sdk/extensions/ci.yml index 813360f62cb3..e46a26f97a9d 100644 --- a/sdk/extensions/ci.yml +++ b/sdk/extensions/ci.yml @@ -37,3 +37,7 @@ extends: safeName: AzureExtensionsAspNetCoreConfigurationSecrets - name: Microsoft.Azure.WebJobs.Extensions.Clients safeName: MicrosoftAzureWebJobsExtensionsClients + CheckAOTCompat: true + AOTTestInputs: + - ArtifactName: Microsoft.Extensions.Azure + ExpectedWarningsFilepath: /Microsoft.Extensions.Azure/tests/compatibility/ExpectedAotWarnings.txt diff --git a/sdk/identity/Azure.Identity/src/AzureIdentityEventSource.cs b/sdk/identity/Azure.Identity/src/AzureIdentityEventSource.cs index f8329c240c78..98f63740ce04 100644 --- a/sdk/identity/Azure.Identity/src/AzureIdentityEventSource.cs +++ b/sdk/identity/Azure.Identity/src/AzureIdentityEventSource.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Tracing; using System.Globalization; using System.Text; @@ -73,6 +74,7 @@ public void GetTokenSucceeded(string method, TokenRequestContext context, DateTi } } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Parameters to this method are primitive and are trimmer safe.")] [Event(GetTokenSucceededEvent, Level = EventLevel.Informational, Message = "{0} succeeded. Scopes: {1} ParentRequestId: {2} ExpiresOn: {3}")] public void GetTokenSucceeded(string method, string scopes, string parentRequestId, string expiresOn) { @@ -88,6 +90,7 @@ public void GetTokenFailed(string method, TokenRequestContext context, Exception } } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Parameters to this method are primitive and are trimmer safe.")] [Event(GetTokenFailedEvent, Level = EventLevel.Informational, Message = "{0} was unable to retrieve an access token. Scopes: {1} ParentRequestId: {2} Exception: {3}")] public void GetTokenFailed(string method, string scopes, string parentRequestId, string exception) { @@ -308,6 +311,7 @@ public void TenantIdDiscoveredAndUsed(string explicitTenantId, string contextTen } } + [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "Parameters to this method are primitive and are trimmer safe.")] [Event(AuthenticatedAccountDetailsEvent, Level = EventLevel.Informational, Message = AuthenticatedAccountDetailsMessage)] public void AuthenticatedAccountDetails(string clientId, string tenantId, string upn, string objectId) { diff --git a/sdk/identity/Azure.Identity/tests/compatibility/ExpectedAotWarnings.txt b/sdk/identity/Azure.Identity/tests/compatibility/ExpectedAotWarnings.txt new file mode 100644 index 000000000000..27b29afd505f --- /dev/null +++ b/sdk/identity/Azure.Identity/tests/compatibility/ExpectedAotWarnings.txt @@ -0,0 +1,11 @@ +ContentValidator\.cs\(\d*\): AOT analysis warning IL3050: System\.Xml\.Schema\.ParticleContentValidator\.BuildTransitionTable\(BitSet,BitSet\[\],Int32\): Using member 'System\.Collections\.ArrayList\.ToArray\(Type\)' which has 'RequiresDynamicCodeAttribute' +DataTypeImplementation\.cs\(\d*\): AOT analysis warning IL3050: System\.Xml\.Schema\.Datatype_List\.TryParseValue\(String,XmlNameTable,IXmlNamespaceResolver,Object&\): Using member 'System\.Collections\.ArrayList\.ToArray\(Type\)' which has 'RequiresDynamicCodeAttribute' +DataTypeImplementation\.cs\(\d*\): AOT analysis warning IL3050: System\.Xml\.Schema\.Datatype_List\.TryParseValue\(String,XmlNameTable,IXmlNamespaceResolver,Object&\): Using member 'System\.Collections\.ArrayList\.ToArray\(Type\)' which has 'RequiresDynamicCodeAttribute' +XmlValueConverter\.cs\(\d*\): AOT analysis warning IL3050: System\.Xml\.Schema\.XmlBaseConverter\.XmlBaseConverter\(XmlBaseConverter\): Using member 'System\.Array\.CreateInstance\(Type,Int32\)' which has 'RequiresDynamicCodeAttribute' +Azure\.Core.src.Shared.DiagnosticScope\.cs\(\d*\): AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.Dispose\(\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +Azure\.Core.src.Shared.DiagnosticScope\.cs\(\d*\): AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.MarkFailed\(!!0,String\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +Azure\.Core.src.Shared.DiagnosticScope\.cs\(\d*\): AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.WriteStartEvent\(\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +ILC : AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.Dispose\(\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +ILC : AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.MarkFailed\(!!0,String\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +ILC : AOT analysis warning IL3050: Azure\.Core\.Pipeline\.DiagnosticScope\.ActivityAdapter\.WriteStartEvent\(\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' +System\.Net\.Http.src.System.Net.Http.DiagnosticsHandler\.cs\(\d*\): AOT analysis warning IL3050: System\.Net\.Http\.DiagnosticsHandler\.Write\(DiagnosticSource,String,!!0\): Using member 'System\.Diagnostics\.DiagnosticSource\.Write\(String,Object\)' which has 'RequiresDynamicCodeAttribute' diff --git a/sdk/identity/ci.yml b/sdk/identity/ci.yml index 78ef81ce315d..ccbb5496ca9c 100644 --- a/sdk/identity/ci.yml +++ b/sdk/identity/ci.yml @@ -31,3 +31,7 @@ extends: safeName: AzureIdentity - name: Azure.Identity.Broker safeName: AzureIdentityBroker + CheckAOTCompat: true + AOTTestInputs: + - ArtifactName: Azure.Identity + ExpectedWarningsFilepath: /Azure.Identity/tests/compatibility/ExpectedAotWarnings.txt