Skip to content

Commit cfd20ad

Browse files
authored
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
1 parent e133683 commit cfd20ad

File tree

7 files changed

+22
-10
lines changed

7 files changed

+22
-10
lines changed

src/Hosting/Abstractions/src/HostingAbstractionsWebHostBuilderExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5+
using System.Diagnostics.CodeAnalysis;
56
using System.Globalization;
67
using System.Linq;
78
using System.Threading;
@@ -47,14 +48,14 @@ public static IWebHostBuilder CaptureStartupErrors(this IWebHostBuilder hostBuil
4748
/// <param name="hostBuilder">The <see cref="IWebHostBuilder"/> to configure.</param>
4849
/// <param name="startupAssemblyName">The name of the assembly containing the startup type.</param>
4950
/// <returns>The <see cref="IWebHostBuilder"/>.</returns>
51+
[RequiresUnreferencedCode("Types and members the loaded assembly depends on might be removed.")]
5052
public static IWebHostBuilder UseStartup(this IWebHostBuilder hostBuilder, string startupAssemblyName)
5153
{
5254
if (startupAssemblyName == null)
5355
{
5456
throw new ArgumentNullException(nameof(startupAssemblyName));
5557
}
5658

57-
5859
return hostBuilder
5960
.UseSetting(WebHostDefaults.ApplicationKey, startupAssemblyName)
6061
.UseSetting(WebHostDefaults.StartupAssemblyKey, startupAssemblyName);

src/Hosting/Abstractions/src/HostingStartupAttribute.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
// Copyright (c) .NET Foundation. All rights reserved.
1+
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5+
using System.Diagnostics.CodeAnalysis;
56
using System.Reflection;
67

78
namespace Microsoft.AspNetCore.Hosting
@@ -16,7 +17,7 @@ public sealed class HostingStartupAttribute : Attribute
1617
/// Constructs the <see cref="HostingStartupAttribute"/> with the specified type.
1718
/// </summary>
1819
/// <param name="hostingStartupType">A type that implements <see cref="IHostingStartup"/>.</param>
19-
public HostingStartupAttribute(Type hostingStartupType)
20+
public HostingStartupAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)] Type hostingStartupType)
2021
{
2122
if (hostingStartupType == null)
2223
{
@@ -35,6 +36,7 @@ public HostingStartupAttribute(Type hostingStartupType)
3536
/// The implementation of <see cref="IHostingStartup"/> that should be loaded when
3637
/// starting an application.
3738
/// </summary>
39+
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor)]
3840
public Type HostingStartupType { get; }
3941
}
40-
}
42+
}

src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ public IWebHostBuilder UseStartup([DynamicallyAccessedMembers(StartupLinkerOptio
234234
return this;
235235
}
236236

237+
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2006:UnrecognizedReflectionPattern", Justification = "We need to call a generic method on IHostBuilder.")]
237238
private void UseStartup([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Type startupType, HostBuilderContext context, IServiceCollection services, object instance = null)
238239
{
239240
var webHostBuilderContext = GetWebHostBuilderContext(context);
@@ -275,12 +276,12 @@ private void UseStartup([DynamicallyAccessedMembers(StartupLinkerOptions.Accessi
275276
var actionType = typeof(Action<,>).MakeGenericType(typeof(HostBuilderContext), containerType);
276277

277278
// Get the private ConfigureContainer method on this type then close over the container type
278-
var configureCallback = GetType().GetMethod(nameof(ConfigureContainer), BindingFlags.NonPublic | BindingFlags.Instance)
279+
var configureCallback = typeof(GenericWebHostBuilder).GetMethod(nameof(ConfigureContainerImpl), BindingFlags.NonPublic | BindingFlags.Instance)
279280
.MakeGenericMethod(containerType)
280281
.CreateDelegate(actionType, this);
281282

282283
// _builder.ConfigureContainer<T>(ConfigureContainer);
283-
typeof(IHostBuilder).GetMethods().First(m => m.Name == nameof(IHostBuilder.ConfigureContainer))
284+
typeof(IHostBuilder).GetMethod(nameof(IHostBuilder.ConfigureContainer))
284285
.MakeGenericMethod(containerType)
285286
.InvokeWithoutWrappingExceptions(_builder, new object[] { configureCallback });
286287
}
@@ -310,7 +311,7 @@ private void UseStartup([DynamicallyAccessedMembers(StartupLinkerOptions.Accessi
310311
});
311312
}
312313

313-
private void ConfigureContainer<TContainer>(HostBuilderContext context, TContainer container)
314+
private void ConfigureContainerImpl<TContainer>(HostBuilderContext context, TContainer container)
314315
{
315316
var instance = context.Properties[_startupKey];
316317
var builder = (ConfigureContainerBuilder)context.Properties[typeof(ConfigureContainerBuilder)];

src/Hosting/Hosting/src/Internal/StartupLoader.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ void RunPipeline(TContainerBuilder containerBuilder)
222222
}
223223
}
224224

225+
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026:RequiresUnreferencedCode", Justification = "We're warning at the entry point. This is an implementation detail.")]
225226
public static Type FindStartupType(string startupAssemblyName, string environmentName)
226227
{
227228
if (string.IsNullOrEmpty(startupAssemblyName))

src/Hosting/Server.IntegrationTesting/src/ApplicationPublisher.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,9 @@ public virtual Task<PublishedApplication> Publish(DeploymentParameters deploymen
7979
// https://stackoverflow.com/a/37983587/102052
8080
//
8181
// 2. If "dotnet publish" does hang indefinitely for some reason, tests should fail fast with an error message.
82-
const int timeoutMinutes = 5;
83-
if (hostProcess.WaitForExit(milliseconds: timeoutMinutes * 60 * 1000))
82+
var timeout = deploymentParameters.PublishTimeout ?? TimeSpan.FromMinutes(5);
83+
84+
if (hostProcess.WaitForExit(milliseconds: (int)timeout.TotalMilliseconds))
8485
{
8586
if (hostProcess.ExitCode != 0)
8687
{
@@ -91,7 +92,7 @@ public virtual Task<PublishedApplication> Publish(DeploymentParameters deploymen
9192
}
9293
else
9394
{
94-
var message = $"{DotnetCommandName} publish failed to exit after {timeoutMinutes} minutes";
95+
var message = $"{DotnetCommandName} publish failed to exit after {timeout.TotalMinutes} minutes";
9596
logger.LogError(message);
9697
throw new Exception(message);
9798
}

src/Hosting/Server.IntegrationTesting/src/Common/DeploymentParameters.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,11 @@ public DeploymentParameters(DeploymentParameters parameters)
179179
/// </summary>
180180
public Action<DeploymentParameters> UserAdditionalCleanup { get; set; }
181181

182+
/// <summary>
183+
/// Timeout for publish
184+
/// </summary>
185+
public TimeSpan? PublishTimeout { get; set; }
186+
182187
public override string ToString()
183188
{
184189
return string.Format(

src/Hosting/test/FunctionalTests/LinkedApplicationTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public async Task LinkedApplicationWorks()
3737
ApplicationType = ApplicationType.Standalone,
3838
PublishApplicationBeforeDeployment = true,
3939
RestoreDependencies = true,
40+
PublishTimeout = TimeSpan.FromMinutes(10), // Machines are slow (these tests restore)
4041
StatusMessagesEnabled = false
4142
};
4243

0 commit comments

Comments
 (0)