diff --git a/src/libraries/Common/src/Extensions/ProviderAliasUtilities/ProviderAliasUtilities.cs b/src/libraries/Common/src/Extensions/ProviderAliasUtilities/ProviderAliasUtilities.cs index 4fb6f86ba23e6..40e80be644765 100644 --- a/src/libraries/Common/src/Extensions/ProviderAliasUtilities/ProviderAliasUtilities.cs +++ b/src/libraries/Common/src/Extensions/ProviderAliasUtilities/ProviderAliasUtilities.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics; using System.Reflection; namespace Microsoft.Extensions.Logging @@ -9,21 +10,18 @@ namespace Microsoft.Extensions.Logging internal static class ProviderAliasUtilities { private const string AliasAttibuteTypeFullName = "Microsoft.Extensions.Logging.ProviderAliasAttribute"; - private const string AliasAttibuteAliasProperty = "Alias"; internal static string GetAlias(Type providerType) { - foreach (object attribute in providerType.GetTypeInfo().GetCustomAttributes(inherit: false)) + foreach (CustomAttributeData attributeData in CustomAttributeData.GetCustomAttributes(providerType)) { - if (attribute.GetType().FullName == AliasAttibuteTypeFullName) + if (attributeData.AttributeType.FullName == AliasAttibuteTypeFullName) { - PropertyInfo valueProperty = attribute - .GetType() - .GetProperty(AliasAttibuteAliasProperty, BindingFlags.Public | BindingFlags.Instance); - - if (valueProperty != null) + foreach (CustomAttributeTypedArgument arg in attributeData.ConstructorArguments) { - return valueProperty.GetValue(attribute) as string; + Debug.Assert(arg.ArgumentType == typeof(string)); + + return arg.Value?.ToString(); } } } diff --git a/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/Microsoft.Extensions.Hosting.Abstractions.csproj b/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/Microsoft.Extensions.Hosting.Abstractions.csproj index 1b488e0228397..d0f3cc26369a9 100644 --- a/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/Microsoft.Extensions.Hosting.Abstractions.csproj +++ b/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/Microsoft.Extensions.Hosting.Abstractions.csproj @@ -1,4 +1,4 @@ - + netstandard2.1;netstandard2.0;net461 @@ -6,6 +6,11 @@ true + + + + + diff --git a/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/ServiceCollectionHostedServiceExtensions.cs b/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/ServiceCollectionHostedServiceExtensions.cs index f1c39b3527941..5b8092edbd1f1 100644 --- a/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/ServiceCollectionHostedServiceExtensions.cs +++ b/src/libraries/Microsoft.Extensions.Hosting.Abstractions/src/ServiceCollectionHostedServiceExtensions.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; @@ -15,7 +16,7 @@ public static class ServiceCollectionHostedServiceExtensions /// An to register. /// The to register with. /// The original . - public static IServiceCollection AddHostedService(this IServiceCollection services) + public static IServiceCollection AddHostedService<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] THostedService>(this IServiceCollection services) where THostedService : class, IHostedService { services.TryAddEnumerable(ServiceDescriptor.Singleton()); diff --git a/src/libraries/Microsoft.Extensions.Hosting/tests/TrimmingTests/AddHostedServiceTests.cs b/src/libraries/Microsoft.Extensions.Hosting/tests/TrimmingTests/AddHostedServiceTests.cs new file mode 100644 index 0000000000000..585eea0a6a07f --- /dev/null +++ b/src/libraries/Microsoft.Extensions.Hosting/tests/TrimmingTests/AddHostedServiceTests.cs @@ -0,0 +1,34 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System.Threading; +using System.Threading.Tasks; + +class Program +{ + static int Main(string[] args) + { + IServiceCollection descriptors = new ServiceCollection(); + descriptors.AddHostedService(); + + ServiceProvider provider = descriptors.BuildServiceProvider(); + + foreach (IHostedService h in provider.GetServices()) + { + if (!(h is MyHost)) + { + return -1; + } + } + + return 100; + } + + private class MyHost : IHostedService + { + public Task StartAsync(CancellationToken cancellationToken) => Task.CompletedTask; + public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; + } +} diff --git a/src/libraries/Microsoft.Extensions.Hosting/tests/TrimmingTests/Microsoft.Extensions.Hosting.TrimmingTests.proj b/src/libraries/Microsoft.Extensions.Hosting/tests/TrimmingTests/Microsoft.Extensions.Hosting.TrimmingTests.proj new file mode 100644 index 0000000000000..61e8e1a759665 --- /dev/null +++ b/src/libraries/Microsoft.Extensions.Hosting/tests/TrimmingTests/Microsoft.Extensions.Hosting.TrimmingTests.proj @@ -0,0 +1,13 @@ + + + + + Microsoft.Extensions.Hosting.Abstractions;Microsoft.Extensions.DependencyInjection + + + + + + + + diff --git a/src/libraries/Microsoft.Extensions.Http/Microsoft.Extensions.Http.sln b/src/libraries/Microsoft.Extensions.Http/Microsoft.Extensions.Http.sln index 15ace04ecb75d..ab21d6dff380b 100644 --- a/src/libraries/Microsoft.Extensions.Http/Microsoft.Extensions.Http.sln +++ b/src/libraries/Microsoft.Extensions.Http/Microsoft.Extensions.Http.sln @@ -13,10 +13,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Http", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Http", "src\Microsoft.Extensions.Http.csproj", "{A50C941B-09D7-4AB4-85AF-D02E6F96885A}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Http.Tests", "tests\Microsoft.Extensions.Http.Tests.csproj", "{C9FE0B1E-35F6-4AFE-A9A6-DA6C1B88C1E7}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestUtilities", "..\Common\tests\TestUtilities\TestUtilities.csproj", "{92E18BB1-B630-4B03-9B05-47F31D1BF94A}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Http.Tests", "tests\Microsoft.Extensions.Http.Tests\Microsoft.Extensions.Http.Tests.csproj", "{7DADD323-891C-4EA7-8906-6BC4009FA083}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -31,14 +31,14 @@ Global {A50C941B-09D7-4AB4-85AF-D02E6F96885A}.Debug|Any CPU.Build.0 = Debug|Any CPU {A50C941B-09D7-4AB4-85AF-D02E6F96885A}.Release|Any CPU.ActiveCfg = Release|Any CPU {A50C941B-09D7-4AB4-85AF-D02E6F96885A}.Release|Any CPU.Build.0 = Release|Any CPU - {C9FE0B1E-35F6-4AFE-A9A6-DA6C1B88C1E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C9FE0B1E-35F6-4AFE-A9A6-DA6C1B88C1E7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C9FE0B1E-35F6-4AFE-A9A6-DA6C1B88C1E7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C9FE0B1E-35F6-4AFE-A9A6-DA6C1B88C1E7}.Release|Any CPU.Build.0 = Release|Any CPU {92E18BB1-B630-4B03-9B05-47F31D1BF94A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {92E18BB1-B630-4B03-9B05-47F31D1BF94A}.Debug|Any CPU.Build.0 = Debug|Any CPU {92E18BB1-B630-4B03-9B05-47F31D1BF94A}.Release|Any CPU.ActiveCfg = Release|Any CPU {92E18BB1-B630-4B03-9B05-47F31D1BF94A}.Release|Any CPU.Build.0 = Release|Any CPU + {7DADD323-891C-4EA7-8906-6BC4009FA083}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7DADD323-891C-4EA7-8906-6BC4009FA083}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DADD323-891C-4EA7-8906-6BC4009FA083}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7DADD323-891C-4EA7-8906-6BC4009FA083}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -46,8 +46,8 @@ Global GlobalSection(NestedProjects) = preSolution {183E40F1-33A4-461D-AADF-4CF59FB93CCA} = {B51DC955-13A6-41ED-A6C7-DDAB98911513} {A50C941B-09D7-4AB4-85AF-D02E6F96885A} = {0517D0EB-1ED7-420A-A7D7-9A167C102ED2} - {C9FE0B1E-35F6-4AFE-A9A6-DA6C1B88C1E7} = {9DE482AA-076A-4EB1-821F-EE2A4A230B4A} {92E18BB1-B630-4B03-9B05-47F31D1BF94A} = {9DE482AA-076A-4EB1-821F-EE2A4A230B4A} + {7DADD323-891C-4EA7-8906-6BC4009FA083} = {9DE482AA-076A-4EB1-821F-EE2A4A230B4A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F300086C-E02A-417C-8659-59AA5139E68A} diff --git a/src/libraries/Microsoft.Extensions.Http/src/DefaultTypedHttpClientFactory.cs b/src/libraries/Microsoft.Extensions.Http/src/DefaultTypedHttpClientFactory.cs index b5d75b0d9ca47..1b0f442d6091b 100644 --- a/src/libraries/Microsoft.Extensions.Http/src/DefaultTypedHttpClientFactory.cs +++ b/src/libraries/Microsoft.Extensions.Http/src/DefaultTypedHttpClientFactory.cs @@ -2,13 +2,15 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics.CodeAnalysis; using System.Net.Http; using System.Threading; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.Extensions.Http { - internal class DefaultTypedHttpClientFactory : ITypedHttpClientFactory + internal class DefaultTypedHttpClientFactory<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient> : + ITypedHttpClientFactory { private readonly Cache _cache; private readonly IServiceProvider _services; diff --git a/src/libraries/Microsoft.Extensions.Http/src/DependencyInjection/HttpClientBuilderExtensions.cs b/src/libraries/Microsoft.Extensions.Http/src/DependencyInjection/HttpClientBuilderExtensions.cs index f1509da93d16c..8d6ffb703f154 100644 --- a/src/libraries/Microsoft.Extensions.Http/src/DependencyInjection/HttpClientBuilderExtensions.cs +++ b/src/libraries/Microsoft.Extensions.Http/src/DependencyInjection/HttpClientBuilderExtensions.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Net.Http; using System.Threading; @@ -316,7 +317,8 @@ public static IHttpClientBuilder ConfigureHttpMessageHandlerBuilder(this IHttpCl /// scope bound to the message handler, which is managed independently. /// /// - public static IHttpClientBuilder AddTypedClient(this IHttpClientBuilder builder) + public static IHttpClientBuilder AddTypedClient<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient>( + this IHttpClientBuilder builder) where TClient : class { if (builder == null) @@ -327,7 +329,8 @@ public static IHttpClientBuilder AddTypedClient(this IHttpClientBuilder return AddTypedClientCore(builder, validateSingleType: false); } - internal static IHttpClientBuilder AddTypedClientCore(this IHttpClientBuilder builder, bool validateSingleType) + internal static IHttpClientBuilder AddTypedClientCore<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient>( + this IHttpClientBuilder builder, bool validateSingleType) where TClient : class { ReserveClient(builder, typeof(TClient), builder.Name, validateSingleType); @@ -375,7 +378,8 @@ internal static IHttpClientBuilder AddTypedClientCore(this IHttpClientB /// scope bound to the message handler, which is managed independently. /// /// - public static IHttpClientBuilder AddTypedClient(this IHttpClientBuilder builder) + public static IHttpClientBuilder AddTypedClient( + this IHttpClientBuilder builder) where TClient : class where TImplementation : class, TClient { @@ -387,7 +391,8 @@ public static IHttpClientBuilder AddTypedClient(this I return AddTypedClientCore(builder, validateSingleType: false); } - internal static IHttpClientBuilder AddTypedClientCore(this IHttpClientBuilder builder, bool validateSingleType) + internal static IHttpClientBuilder AddTypedClientCore( + this IHttpClientBuilder builder, bool validateSingleType) where TClient : class where TImplementation : class, TClient { diff --git a/src/libraries/Microsoft.Extensions.Http/src/DependencyInjection/HttpClientFactoryServiceCollectionExtensions.cs b/src/libraries/Microsoft.Extensions.Http/src/DependencyInjection/HttpClientFactoryServiceCollectionExtensions.cs index d0f90cf3e1ca5..b0a34b788e430 100644 --- a/src/libraries/Microsoft.Extensions.Http/src/DependencyInjection/HttpClientFactoryServiceCollectionExtensions.cs +++ b/src/libraries/Microsoft.Extensions.Http/src/DependencyInjection/HttpClientFactoryServiceCollectionExtensions.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics.CodeAnalysis; using System.Net.Http; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Http; @@ -198,7 +199,8 @@ public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, /// as the service type. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services) + public static IHttpClientBuilder AddHttpClient<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient>( + this IServiceCollection services) where TClient : class { if (services == null) @@ -240,7 +242,8 @@ public static IHttpClientBuilder AddHttpClient(this IServiceCollection /// as the service type. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services) + public static IHttpClientBuilder AddHttpClient( + this IServiceCollection services) where TClient : class where TImplementation : class, TClient { @@ -282,7 +285,8 @@ public static IHttpClientBuilder AddHttpClient(this IS /// Use as the name to configure the default client. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name) + public static IHttpClientBuilder AddHttpClient<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient>( + this IServiceCollection services, string name) where TClient : class { if (services == null) @@ -332,7 +336,8 @@ public static IHttpClientBuilder AddHttpClient(this IServiceCollection /// Use as the name to configure the default client. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name) + public static IHttpClientBuilder AddHttpClient( + this IServiceCollection services, string name) where TClient : class where TImplementation : class, TClient { @@ -376,7 +381,8 @@ public static IHttpClientBuilder AddHttpClient(this IS /// as the service type. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, Action configureClient) + public static IHttpClientBuilder AddHttpClient<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient>( + this IServiceCollection services, Action configureClient) where TClient : class { if (services == null) @@ -421,7 +427,8 @@ public static IHttpClientBuilder AddHttpClient(this IServiceCollection /// as the service type. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, Action configureClient) + public static IHttpClientBuilder AddHttpClient<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient>( + this IServiceCollection services, Action configureClient) where TClient : class { if (services == null) @@ -470,7 +477,8 @@ public static IHttpClientBuilder AddHttpClient(this IServiceCollection /// as the service type. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, Action configureClient) + public static IHttpClientBuilder AddHttpClient( + this IServiceCollection services, Action configureClient) where TClient : class where TImplementation : class, TClient { @@ -520,7 +528,8 @@ public static IHttpClientBuilder AddHttpClient(this IS /// as the service type. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, Action configureClient) + public static IHttpClientBuilder AddHttpClient( + this IServiceCollection services, Action configureClient) where TClient : class where TImplementation : class, TClient { @@ -569,7 +578,8 @@ public static IHttpClientBuilder AddHttpClient(this IS /// Use as the name to configure the default client. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name, Action configureClient) + public static IHttpClientBuilder AddHttpClient<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient>( + this IServiceCollection services, string name, Action configureClient) where TClient : class { if (services == null) @@ -621,7 +631,8 @@ public static IHttpClientBuilder AddHttpClient(this IServiceCollection /// Use as the name to configure the default client. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name, Action configureClient) + public static IHttpClientBuilder AddHttpClient<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient>( + this IServiceCollection services, string name, Action configureClient) where TClient : class { if (services == null) @@ -677,7 +688,8 @@ public static IHttpClientBuilder AddHttpClient(this IServiceCollection /// Use as the name to configure the default client. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name, Action configureClient) + public static IHttpClientBuilder AddHttpClient( + this IServiceCollection services, string name, Action configureClient) where TClient : class where TImplementation : class, TClient { @@ -734,7 +746,8 @@ public static IHttpClientBuilder AddHttpClient(this IS /// Use as the name to configure the default client. /// /// - public static IHttpClientBuilder AddHttpClient(this IServiceCollection services, string name, Action configureClient) + public static IHttpClientBuilder AddHttpClient( + this IServiceCollection services, string name, Action configureClient) where TClient : class where TImplementation : class, TClient { diff --git a/src/libraries/Microsoft.Extensions.Http/src/ITypedHttpClientFactory.cs b/src/libraries/Microsoft.Extensions.Http/src/ITypedHttpClientFactory.cs index 67ac64c230125..979f99a43a658 100644 --- a/src/libraries/Microsoft.Extensions.Http/src/ITypedHttpClientFactory.cs +++ b/src/libraries/Microsoft.Extensions.Http/src/ITypedHttpClientFactory.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics.CodeAnalysis; using System.Net.Http; using Microsoft.Extensions.DependencyInjection; @@ -96,7 +97,7 @@ namespace Microsoft.Extensions.Http /// } /// /// - public interface ITypedHttpClientFactory + public interface ITypedHttpClientFactory<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TClient> { /// /// Creates a typed client given an associated . diff --git a/src/libraries/Microsoft.Extensions.Http/src/Microsoft.Extensions.Http.csproj b/src/libraries/Microsoft.Extensions.Http/src/Microsoft.Extensions.Http.csproj index e27e847e380f1..6de909a45f7ea 100644 --- a/src/libraries/Microsoft.Extensions.Http/src/Microsoft.Extensions.Http.csproj +++ b/src/libraries/Microsoft.Extensions.Http/src/Microsoft.Extensions.Http.csproj @@ -12,6 +12,8 @@ Link="Common\src\Extensions\TypeNameHelper\TypeNameHelper.cs" /> + + diff --git a/src/libraries/Microsoft.Extensions.Http/tests/DefaultHttpClientFactoryTest.cs b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/DefaultHttpClientFactoryTest.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Http/tests/DefaultHttpClientFactoryTest.cs rename to src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/DefaultHttpClientFactoryTest.cs diff --git a/src/libraries/Microsoft.Extensions.Http/tests/DefaultHttpMessageHandlerBuilderTest.cs b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/DefaultHttpMessageHandlerBuilderTest.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Http/tests/DefaultHttpMessageHandlerBuilderTest.cs rename to src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/DefaultHttpMessageHandlerBuilderTest.cs diff --git a/src/libraries/Microsoft.Extensions.Http/tests/DependencyInjection/HttpClientFactoryServiceCollectionExtensionsTest.cs b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/DependencyInjection/HttpClientFactoryServiceCollectionExtensionsTest.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Http/tests/DependencyInjection/HttpClientFactoryServiceCollectionExtensionsTest.cs rename to src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/DependencyInjection/HttpClientFactoryServiceCollectionExtensionsTest.cs diff --git a/src/libraries/Microsoft.Extensions.Http/tests/DependencyInjection/OtherTestOptions.cs b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/DependencyInjection/OtherTestOptions.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Http/tests/DependencyInjection/OtherTestOptions.cs rename to src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/DependencyInjection/OtherTestOptions.cs diff --git a/src/libraries/Microsoft.Extensions.Http/tests/HttpMessageHandlerBuilderTest.cs b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/HttpMessageHandlerBuilderTest.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Http/tests/HttpMessageHandlerBuilderTest.cs rename to src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/HttpMessageHandlerBuilderTest.cs diff --git a/src/libraries/Microsoft.Extensions.Http/tests/ITestTypedClient.cs b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/ITestTypedClient.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Http/tests/ITestTypedClient.cs rename to src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/ITestTypedClient.cs diff --git a/src/libraries/Microsoft.Extensions.Http/tests/Logging/HttpHeadersLogValueTest.cs b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/Logging/HttpHeadersLogValueTest.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Http/tests/Logging/HttpHeadersLogValueTest.cs rename to src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/Logging/HttpHeadersLogValueTest.cs diff --git a/src/libraries/Microsoft.Extensions.Http/tests/Logging/RedactedLogValueIntegrationTest.cs b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/Logging/RedactedLogValueIntegrationTest.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Http/tests/Logging/RedactedLogValueIntegrationTest.cs rename to src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/Logging/RedactedLogValueIntegrationTest.cs diff --git a/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests.csproj b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/Microsoft.Extensions.Http.Tests.csproj similarity index 90% rename from src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests.csproj rename to src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/Microsoft.Extensions.Http.Tests.csproj index 3c192f903d026..76700604db855 100644 --- a/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests.csproj +++ b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/Microsoft.Extensions.Http.Tests.csproj @@ -1,4 +1,4 @@ - + $(NetCoreAppCurrent);net461 @@ -24,7 +24,7 @@ - + diff --git a/src/libraries/Microsoft.Extensions.Http/tests/TestTypedClient.cs b/src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/TestTypedClient.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Http/tests/TestTypedClient.cs rename to src/libraries/Microsoft.Extensions.Http/tests/Microsoft.Extensions.Http.Tests/TestTypedClient.cs diff --git a/src/libraries/Microsoft.Extensions.Http/tests/TrimmingTests/AddTypedClientTests.cs b/src/libraries/Microsoft.Extensions.Http/tests/TrimmingTests/AddTypedClientTests.cs new file mode 100644 index 0000000000000..17bcf13fc5a67 --- /dev/null +++ b/src/libraries/Microsoft.Extensions.Http/tests/TrimmingTests/AddTypedClientTests.cs @@ -0,0 +1,58 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.Extensions.DependencyInjection; +using System.Net.Http; + +class Program +{ + static int Main(string[] args) + { + IServiceCollection descriptors = new ServiceCollection(); + descriptors.AddHttpClient("test1") + .AddTypedClient() + .AddTypedClient(); + + descriptors.AddHttpClient("test2"); + descriptors.AddHttpClient("test3"); + + ServiceProvider provider = descriptors.BuildServiceProvider(); + + TypedClientA clientA = provider.GetRequiredService(); + ITypedClientB clientB = provider.GetRequiredService(); + TypedClientC clientC = provider.GetRequiredService(); + ITypedClientD clientD = provider.GetRequiredService(); + + if (clientA == null || + !(clientB is TypedClientB) || + clientC == null || + !(clientD is TypedClientD)) + { + return -1; + } + + return 100; + } + + class TypedClientA + { + public TypedClientA(HttpClient httpClient) { } + } + + interface ITypedClientB { } + class TypedClientB : ITypedClientB + { + public TypedClientB(HttpClient httpClient) { } + } + + class TypedClientC + { + public TypedClientC(HttpClient httpClient) { } + } + + interface ITypedClientD { } + class TypedClientD : ITypedClientD + { + public TypedClientD(HttpClient httpClient) { } + } +} diff --git a/src/libraries/Microsoft.Extensions.Http/tests/TrimmingTests/Microsoft.Extensions.Http.TrimmingTests.proj b/src/libraries/Microsoft.Extensions.Http/tests/TrimmingTests/Microsoft.Extensions.Http.TrimmingTests.proj new file mode 100644 index 0000000000000..4d71019770909 --- /dev/null +++ b/src/libraries/Microsoft.Extensions.Http/tests/TrimmingTests/Microsoft.Extensions.Http.TrimmingTests.proj @@ -0,0 +1,13 @@ + + + + + Microsoft.Extensions.Http + + + + + + + + diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/Microsoft.Extensions.Logging.Console.sln b/src/libraries/Microsoft.Extensions.Logging.Console/Microsoft.Extensions.Logging.Console.sln index a7cab36d8df35..24a098f8e6b3c 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Console/Microsoft.Extensions.Logging.Console.sln +++ b/src/libraries/Microsoft.Extensions.Logging.Console/Microsoft.Extensions.Logging.Console.sln @@ -13,7 +13,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Loggin EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{56A299FB-3733-4AF5-AE10-66AB73D6FC13}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Logging.Console.Tests", "tests\Microsoft.Extensions.Logging.Console.Tests.csproj", "{9B344154-013F-4D6B-99A5-77DFA1CB8CC0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Logging.Console.Tests", "tests\Microsoft.Extensions.Logging.Console.Tests\Microsoft.Extensions.Logging.Console.Tests.csproj", "{A2CFB82A-F553-44CD-8765-97409380EED9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -29,10 +29,10 @@ Global {CDEDF61A-4D74-4EAA-B31E-AF5CAAA7B974}.Debug|Any CPU.Build.0 = Debug|Any CPU {CDEDF61A-4D74-4EAA-B31E-AF5CAAA7B974}.Release|Any CPU.ActiveCfg = Release|Any CPU {CDEDF61A-4D74-4EAA-B31E-AF5CAAA7B974}.Release|Any CPU.Build.0 = Release|Any CPU - {9B344154-013F-4D6B-99A5-77DFA1CB8CC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9B344154-013F-4D6B-99A5-77DFA1CB8CC0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9B344154-013F-4D6B-99A5-77DFA1CB8CC0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9B344154-013F-4D6B-99A5-77DFA1CB8CC0}.Release|Any CPU.Build.0 = Release|Any CPU + {A2CFB82A-F553-44CD-8765-97409380EED9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2CFB82A-F553-44CD-8765-97409380EED9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2CFB82A-F553-44CD-8765-97409380EED9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2CFB82A-F553-44CD-8765-97409380EED9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -40,7 +40,7 @@ Global GlobalSection(NestedProjects) = preSolution {6D191D5A-572C-4BFA-B73B-C24AF80E8016} = {A12B6049-11A7-4E2B-857B-620B917B4A46} {CDEDF61A-4D74-4EAA-B31E-AF5CAAA7B974} = {A1F1D16A-5787-45E5-AF85-617702C216C6} - {9B344154-013F-4D6B-99A5-77DFA1CB8CC0} = {56A299FB-3733-4AF5-AE10-66AB73D6FC13} + {A2CFB82A-F553-44CD-8765-97409380EED9} = {56A299FB-3733-4AF5-AE10-66AB73D6FC13} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E75E4D9D-8919-409F-8FF1-67DD9C346EA7} diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerExtensions.cs b/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerExtensions.cs index 2e591ec819fce..8cd8a594e359b 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerExtensions.cs +++ b/src/libraries/Microsoft.Extensions.Logging.Console/src/ConsoleLoggerExtensions.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -120,7 +121,7 @@ private static ILoggingBuilder AddFormatterWithName(this ILoggingBuilder builder /// Adds a custom console logger formatter 'TFormatter' to be configured with options 'TOptions'. /// /// The to use. - public static ILoggingBuilder AddConsoleFormatter(this ILoggingBuilder builder) + public static ILoggingBuilder AddConsoleFormatter<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFormatter, TOptions>(this ILoggingBuilder builder) where TOptions : ConsoleFormatterOptions where TFormatter : ConsoleFormatter { @@ -138,7 +139,7 @@ public static ILoggingBuilder AddConsoleFormatter(this ILo /// /// The to use. /// A delegate to configure options 'TOptions' for custom formatter 'TFormatter'. - public static ILoggingBuilder AddConsoleFormatter(this ILoggingBuilder builder, Action configure) + public static ILoggingBuilder AddConsoleFormatter<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFormatter, TOptions>(this ILoggingBuilder builder, Action configure) where TOptions : ConsoleFormatterOptions where TFormatter : ConsoleFormatter { diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/src/FormatterOptionsMonitor.cs b/src/libraries/Microsoft.Extensions.Logging.Console/src/FormatterOptionsMonitor.cs index d29376cb9b84b..00adb44b4b61f 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Console/src/FormatterOptionsMonitor.cs +++ b/src/libraries/Microsoft.Extensions.Logging.Console/src/FormatterOptionsMonitor.cs @@ -2,11 +2,14 @@ // The .NET Foundation licenses this file to you under the MIT license. using System; +using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Options; namespace Microsoft.Extensions.Logging.Console { - internal class FormatterOptionsMonitor : IOptionsMonitor where TOptions : ConsoleFormatterOptions + internal class FormatterOptionsMonitor<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] TOptions> : + IOptionsMonitor + where TOptions : ConsoleFormatterOptions { private TOptions _options; public FormatterOptionsMonitor(TOptions options) diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/src/Microsoft.Extensions.Logging.Console.csproj b/src/libraries/Microsoft.Extensions.Logging.Console/src/Microsoft.Extensions.Logging.Console.csproj index 29bfc3f990689..1e8e0f43fa4b7 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Console/src/Microsoft.Extensions.Logging.Console.csproj +++ b/src/libraries/Microsoft.Extensions.Logging.Console/src/Microsoft.Extensions.Logging.Console.csproj @@ -28,6 +28,11 @@ Link="Common\Interop\Windows\Interop.GetStdHandle.cs" /> + + + + + diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/AnsiParserTests.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/AnsiParserTests.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/AnsiParserTests.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/AnsiParserTests.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/Console/ConsoleContext.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/Console/ConsoleContext.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/Console/ConsoleContext.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/Console/ConsoleContext.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/Console/ConsoleSink.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/Console/ConsoleSink.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/Console/ConsoleSink.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/Console/ConsoleSink.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/Console/TestConsole.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/Console/TestConsole.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/Console/TestConsole.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/Console/TestConsole.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/ConsoleFormatterTests.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/ConsoleFormatterTests.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/ConsoleFormatterTests.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/ConsoleFormatterTests.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/ConsoleLoggerExtensionsTests.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/ConsoleLoggerExtensionsTests.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/ConsoleLoggerExtensionsTests.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/ConsoleLoggerExtensionsTests.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/ConsoleLoggerTest.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/ConsoleLoggerTest.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/ConsoleLoggerTest.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/ConsoleLoggerTest.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/JsonConsoleFormatterTests.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/JsonConsoleFormatterTests.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/JsonConsoleFormatterTests.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/JsonConsoleFormatterTests.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests.csproj b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/Microsoft.Extensions.Logging.Console.Tests.csproj similarity index 60% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests.csproj rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/Microsoft.Extensions.Logging.Console.Tests.csproj index 6d1c916ab02d7..6caa09d4a5fa9 100644 --- a/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests.csproj +++ b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/Microsoft.Extensions.Logging.Console.Tests.csproj @@ -7,7 +7,7 @@ - + \ No newline at end of file diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/SimpleConsoleFormatterTests.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/SimpleConsoleFormatterTests.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/SimpleConsoleFormatterTests.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/SimpleConsoleFormatterTests.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/TestFormatterOptionsMonitor.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/TestFormatterOptionsMonitor.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/TestFormatterOptionsMonitor.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/TestFormatterOptionsMonitor.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/TextWriterExtensionsTests.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/TextWriterExtensionsTests.cs similarity index 100% rename from src/libraries/Microsoft.Extensions.Logging.Console/tests/TextWriterExtensionsTests.cs rename to src/libraries/Microsoft.Extensions.Logging.Console/tests/Microsoft.Extensions.Logging.Console.Tests/TextWriterExtensionsTests.cs diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/TrimmingTests/AddConsoleFormatterTests.cs b/src/libraries/Microsoft.Extensions.Logging.Console/tests/TrimmingTests/AddConsoleFormatterTests.cs new file mode 100644 index 0000000000000..e12c7d7797783 --- /dev/null +++ b/src/libraries/Microsoft.Extensions.Logging.Console/tests/TrimmingTests/AddConsoleFormatterTests.cs @@ -0,0 +1,51 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Logging.Console; +using System.IO; + +class Program +{ + private static int ConstructorCallCount = 0; + private static int WriteCallCount = 0; + + static int Main(string[] args) + { + IServiceCollection descriptors = new ServiceCollection(); + descriptors.AddLogging(builder => + { + builder.AddConsoleFormatter(); + builder.AddConsole(o => { o.FormatterName = "custom"; }); + }); + + ServiceProvider provider = descriptors.BuildServiceProvider(); + + ILoggerProvider logger = provider.GetRequiredService(); + logger.CreateLogger("log").LogError("Hello"); + + if (ConstructorCallCount != 1 || + WriteCallCount != 1) + { + return -1; + } + + return 100; + } + + private class CustomFormatter : ConsoleFormatter + { + public CustomFormatter() : base("Custom") + { + ConstructorCallCount++; + } + public override void Write(in LogEntry logEntry, IExternalScopeProvider scopeProvider, TextWriter textWriter) + { + WriteCallCount++; + } + } + + private class CustomOptions : ConsoleFormatterOptions { } +} diff --git a/src/libraries/Microsoft.Extensions.Logging.Console/tests/TrimmingTests/Microsoft.Extensions.Logging.Console.TrimmingTests.proj b/src/libraries/Microsoft.Extensions.Logging.Console/tests/TrimmingTests/Microsoft.Extensions.Logging.Console.TrimmingTests.proj new file mode 100644 index 0000000000000..353b9d16635ac --- /dev/null +++ b/src/libraries/Microsoft.Extensions.Logging.Console/tests/TrimmingTests/Microsoft.Extensions.Logging.Console.TrimmingTests.proj @@ -0,0 +1,13 @@ + + + + + Microsoft.Extensions.Logging.Console + + + + + + + + diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj index 75ce0856c06db..9ba9856ed6562 100644 --- a/src/libraries/tests.proj +++ b/src/libraries/tests.proj @@ -11,6 +11,7 @@ true false false + true @@ -38,6 +39,7 @@ Condition="'$(TestPackages)' == 'true'" />