Fix some linker warnings, report others (#24553)
* Fix some linker warnings, report others - Added RequiresUnreferencedCode to UseStartup that takes a string - Added some suppressions - Fixed ConfigureContainer calls - Fixed HostingStartupAttribute
This commit is contained in:
parent
e13368391b
commit
cfd20ad2d7
|
|
@ -2,6 +2,7 @@
|
|||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
|
|
@ -47,6 +48,7 @@ namespace Microsoft.AspNetCore.Hosting
|
|||
/// <param name="hostBuilder">The <see cref="IWebHostBuilder"/> to configure.</param>
|
||||
/// <param name="startupAssemblyName">The name of the assembly containing the startup type.</param>
|
||||
/// <returns>The <see cref="IWebHostBuilder"/>.</returns>
|
||||
[RequiresUnreferencedCode("Types and members the loaded assembly depends on might be removed.")]
|
||||
public static IWebHostBuilder UseStartup(this IWebHostBuilder hostBuilder, string startupAssemblyName)
|
||||
{
|
||||
if (startupAssemblyName == null)
|
||||
|
|
@ -54,7 +56,6 @@ namespace Microsoft.AspNetCore.Hosting
|
|||
throw new ArgumentNullException(nameof(startupAssemblyName));
|
||||
}
|
||||
|
||||
|
||||
return hostBuilder
|
||||
.UseSetting(WebHostDefaults.ApplicationKey, startupAssemblyName)
|
||||
.UseSetting(WebHostDefaults.StartupAssemblyKey, startupAssemblyName);
|
||||
|
|
|
|||
|
|
@ -1,7 +1,8 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Microsoft.AspNetCore.Hosting
|
||||
|
|
@ -16,7 +17,7 @@ namespace Microsoft.AspNetCore.Hosting
|
|||
/// Constructs the <see cref="HostingStartupAttribute"/> with the specified type.
|
||||
/// </summary>
|
||||
/// <param name="hostingStartupType">A type that implements <see cref="IHostingStartup"/>.</param>
|
||||
public HostingStartupAttribute(Type hostingStartupType)
|
||||
public HostingStartupAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type hostingStartupType)
|
||||
{
|
||||
if (hostingStartupType == null)
|
||||
{
|
||||
|
|
@ -35,6 +36,7 @@ namespace Microsoft.AspNetCore.Hosting
|
|||
/// The implementation of <see cref="IHostingStartup"/> that should be loaded when
|
||||
/// starting an application.
|
||||
/// </summary>
|
||||
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
|
||||
public Type HostingStartupType { get; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -234,6 +234,7 @@ namespace Microsoft.AspNetCore.Hosting
|
|||
return this;
|
||||
}
|
||||
|
||||
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2006:UnrecognizedReflectionPattern", Justification = "We need to call a generic method on IHostBuilder.")]
|
||||
private void UseStartup([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Type startupType, HostBuilderContext context, IServiceCollection services, object instance = null)
|
||||
{
|
||||
var webHostBuilderContext = GetWebHostBuilderContext(context);
|
||||
|
|
@ -275,12 +276,12 @@ namespace Microsoft.AspNetCore.Hosting
|
|||
var actionType = typeof(Action<,>).MakeGenericType(typeof(HostBuilderContext), containerType);
|
||||
|
||||
// Get the private ConfigureContainer method on this type then close over the container type
|
||||
var configureCallback = GetType().GetMethod(nameof(ConfigureContainer), BindingFlags.NonPublic | BindingFlags.Instance)
|
||||
var configureCallback = typeof(GenericWebHostBuilder).GetMethod(nameof(ConfigureContainerImpl), BindingFlags.NonPublic | BindingFlags.Instance)
|
||||
.MakeGenericMethod(containerType)
|
||||
.CreateDelegate(actionType, this);
|
||||
|
||||
// _builder.ConfigureContainer<T>(ConfigureContainer);
|
||||
typeof(IHostBuilder).GetMethods().First(m => m.Name == nameof(IHostBuilder.ConfigureContainer))
|
||||
typeof(IHostBuilder).GetMethod(nameof(IHostBuilder.ConfigureContainer))
|
||||
.MakeGenericMethod(containerType)
|
||||
.InvokeWithoutWrappingExceptions(_builder, new object[] { configureCallback });
|
||||
}
|
||||
|
|
@ -310,7 +311,7 @@ namespace Microsoft.AspNetCore.Hosting
|
|||
});
|
||||
}
|
||||
|
||||
private void ConfigureContainer<TContainer>(HostBuilderContext context, TContainer container)
|
||||
private void ConfigureContainerImpl<TContainer>(HostBuilderContext context, TContainer container)
|
||||
{
|
||||
var instance = context.Properties[_startupKey];
|
||||
var builder = (ConfigureContainerBuilder)context.Properties[typeof(ConfigureContainerBuilder)];
|
||||
|
|
|
|||
|
|
@ -222,6 +222,7 @@ namespace Microsoft.AspNetCore.Hosting
|
|||
}
|
||||
}
|
||||
|
||||
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "We're warning at the entry point. This is an implementation detail.")]
|
||||
public static Type FindStartupType(string startupAssemblyName, string environmentName)
|
||||
{
|
||||
if (string.IsNullOrEmpty(startupAssemblyName))
|
||||
|
|
|
|||
|
|
@ -79,8 +79,9 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
|||
// https://stackoverflow.com/a/37983587/102052
|
||||
//
|
||||
// 2. If "dotnet publish" does hang indefinitely for some reason, tests should fail fast with an error message.
|
||||
const int timeoutMinutes = 5;
|
||||
if (hostProcess.WaitForExit(milliseconds: timeoutMinutes * 60 * 1000))
|
||||
var timeout = deploymentParameters.PublishTimeout ?? TimeSpan.FromMinutes(5);
|
||||
|
||||
if (hostProcess.WaitForExit(milliseconds: (int)timeout.TotalMilliseconds))
|
||||
{
|
||||
if (hostProcess.ExitCode != 0)
|
||||
{
|
||||
|
|
@ -91,7 +92,7 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
|||
}
|
||||
else
|
||||
{
|
||||
var message = $"{DotnetCommandName} publish failed to exit after {timeoutMinutes} minutes";
|
||||
var message = $"{DotnetCommandName} publish failed to exit after {timeout.TotalMinutes} minutes";
|
||||
logger.LogError(message);
|
||||
throw new Exception(message);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -179,6 +179,11 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting
|
|||
/// </summary>
|
||||
public Action<DeploymentParameters> UserAdditionalCleanup { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Timeout for publish
|
||||
/// </summary>
|
||||
public TimeSpan? PublishTimeout { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return string.Format(
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ namespace Microsoft.AspNetCore.Hosting.FunctionalTests
|
|||
ApplicationType = ApplicationType.Standalone,
|
||||
PublishApplicationBeforeDeployment = true,
|
||||
RestoreDependencies = true,
|
||||
PublishTimeout = TimeSpan.FromMinutes(10), // Machines are slow (these tests restore)
|
||||
StatusMessagesEnabled = false
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue