Skip to content

Commit ffb2147

Browse files
committed
Annotate Serilog.Settings.Configuration as not trim-compatible
Unfortunately I don't have any good news for this library. It looks like the fundamental concept, loading arbitrary types by name from arbitrary assemblies, configured by the user at run-time, is fundamentally incompatible with trimming and AOT. This at least marks it as such. Supporting a feature set like the one provided here would likely require a source generator, or build-time code generation phase.
1 parent 60157bd commit ffb2147

8 files changed

+78
-1
lines changed

src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
using System;
16+
using System.Diagnostics.CodeAnalysis;
1617
using System.Reflection;
1718
using Microsoft.Extensions.Configuration;
1819
using Microsoft.Extensions.DependencyModel;
@@ -43,6 +44,8 @@ public static class ConfigurationLoggerConfigurationExtensions
4344
/// <param name="dependencyContext">The dependency context from which sink/enricher packages can be located. If not supplied, the platform
4445
/// default will be used.</param>
4546
/// <returns>An object allowing configuration to continue.</returns>
47+
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
48+
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
4649
public static LoggerConfiguration Configuration(
4750
this LoggerSettingsConfiguration settingConfiguration,
4851
IConfiguration configuration,
@@ -74,6 +77,8 @@ public static LoggerConfiguration Configuration(
7477
/// <param name="dependencyContext">The dependency context from which sink/enricher packages can be located. If not supplied, the platform
7578
/// default will be used.</param>
7679
/// <returns>An object allowing configuration to continue.</returns>
80+
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
81+
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
7782
public static LoggerConfiguration Configuration(
7883
this LoggerSettingsConfiguration settingConfiguration,
7984
IConfiguration configuration,
@@ -90,6 +95,8 @@ public static LoggerConfiguration Configuration(
9095
/// default will be used.</param>
9196
/// <returns>An object allowing configuration to continue.</returns>
9297
[Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, string sectionName, DependencyContext dependencyContext) instead.")]
98+
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
99+
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
93100
public static LoggerConfiguration ConfigurationSection(
94101
this LoggerSettingsConfiguration settingConfiguration,
95102
IConfigurationSection configSection,
@@ -119,6 +126,8 @@ public static LoggerConfiguration ConfigurationSection(
119126
/// <param name="sectionName">A section name for section which contains a Serilog section.</param>
120127
/// <param name="configurationAssemblySource">Defines how the package identifies assemblies to scan for sinks and other types.</param>
121128
/// <returns>An object allowing configuration to continue.</returns>
129+
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
130+
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
122131
public static LoggerConfiguration Configuration(
123132
this LoggerSettingsConfiguration settingConfiguration,
124133
IConfiguration configuration,
@@ -143,6 +152,8 @@ public static LoggerConfiguration Configuration(
143152
/// <param name="configuration">A configuration object which contains a Serilog section.</param>
144153
/// <param name="configurationAssemblySource">Defines how the package identifies assemblies to scan for sinks and other types.</param>
145154
/// <returns>An object allowing configuration to continue.</returns>
155+
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
156+
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
146157
public static LoggerConfiguration Configuration(
147158
this LoggerSettingsConfiguration settingConfiguration,
148159
IConfiguration configuration,
@@ -158,6 +169,8 @@ public static LoggerConfiguration Configuration(
158169
/// <param name="configurationAssemblySource">Defines how the package identifies assemblies to scan for sinks and other types.</param>
159170
/// <returns>An object allowing configuration to continue.</returns>
160171
[Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, string sectionName, ConfigurationAssemblySource configurationAssemblySource) instead.")]
172+
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
173+
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
161174
public static LoggerConfiguration ConfigurationSection(
162175
this LoggerSettingsConfiguration settingConfiguration,
163176
IConfigurationSection configSection,
@@ -179,6 +192,8 @@ public static LoggerConfiguration ConfigurationSection(
179192
/// <param name="sectionName">A section name for section which contains a Serilog section.</param>
180193
/// <param name="assemblies">A collection of assemblies that contains sinks and other types.</param>
181194
/// <returns>An object allowing configuration to continue.</returns>
195+
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
196+
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
182197
public static LoggerConfiguration Configuration(
183198
this LoggerSettingsConfiguration settingConfiguration,
184199
IConfiguration configuration,
@@ -199,6 +214,8 @@ public static LoggerConfiguration Configuration(
199214
/// <param name="configuration">A configuration object which contains a Serilog section.</param>
200215
/// <param name="assemblies">A collection of assemblies that contains sinks and other types.</param>
201216
/// <returns>An object allowing configuration to continue.</returns>
217+
[RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)]
218+
[RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)]
202219
public static LoggerConfiguration Configuration(
203220
this LoggerSettingsConfiguration settingConfiguration,
204221
IConfiguration configuration,

src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<VersionPrefix>3.3.1</VersionPrefix>
66
<LangVersion>latest</LangVersion>
77
<Authors>Serilog Contributors</Authors>
8-
<TargetFrameworks>netstandard2.0;net451;net461</TargetFrameworks>
8+
<TargetFrameworks>net7.0;netstandard2.0;net451;net461</TargetFrameworks>
99
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
1010
<GenerateDocumentationFile>true</GenerateDocumentationFile>
1111
<AssemblyName>Serilog.Settings.Configuration</AssemblyName>
@@ -22,6 +22,8 @@
2222
<EmbedUntrackedSources>true</EmbedUntrackedSources>
2323
<IncludeSymbols>true</IncludeSymbols>
2424
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
25+
<IsTrimmable>true</IsTrimmable>
26+
<EnableAotAnalyzer>true</EnableAotAnalyzer>
2527
</PropertyGroup>
2628

2729
<ItemGroup>

src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics.CodeAnalysis;
34
using System.Linq;
45
using System.Reflection;
56
using System.Text.RegularExpressions;
@@ -15,6 +16,8 @@
1516

1617
namespace Serilog.Settings.Configuration
1718
{
19+
[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
20+
[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
1821
class ConfigurationReader : IConfigurationReader
1922
{
2023
const string LevelSwitchNameRegex = @"^\${0,1}[A-Za-z]+[A-Za-z0-9]*$";
@@ -268,6 +271,8 @@ void ApplyEnrichment(LoggerConfiguration loggerConfiguration)
268271
}
269272
}
270273

274+
[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
275+
[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
271276
internal ILookup<string, Dictionary<string, IConfigurationArgumentValue>> GetMethodCalls(IConfigurationSection directive)
272277
{
273278
var children = directive.GetChildren().ToList();
@@ -301,6 +306,8 @@ static string GetSectionName(IConfigurationSection s)
301306
}
302307
}
303308

309+
[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
310+
[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
304311
internal static IConfigurationArgumentValue GetArgumentValue(IConfigurationSection argumentSection, IReadOnlyCollection<Assembly> configurationAssemblies)
305312
{
306313
IConfigurationArgumentValue argumentValue;

src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics.CodeAnalysis;
34
using System.Linq;
45
using System.Linq.Expressions;
56
using System.Reflection;
@@ -10,6 +11,8 @@
1011

1112
namespace Serilog.Settings.Configuration
1213
{
14+
[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
15+
[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
1316
class ObjectArgumentValue : IConfigurationArgumentValue
1417
{
1518
readonly IConfigurationSection _section;
@@ -59,6 +62,7 @@ public object ConvertTo(Type toType, ResolutionContext resolutionContext)
5962
// MS Config binding can work with a limited set of primitive types and collections
6063
return _section.Get(toType);
6164

65+
[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)]
6266
object CreateArray()
6367
{
6468
var arrayElementType = toType.GetElementType()!;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#if !NET6_0_OR_GREATER
2+
3+
namespace System.Diagnostics.CodeAnalysis
4+
{
5+
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method, Inherited = false)]
6+
internal sealed class RequiresDynamicCodeAttribute : Attribute
7+
{
8+
public RequiresDynamicCodeAttribute(string message)
9+
{
10+
Message = message;
11+
}
12+
13+
public string Message { get; }
14+
}
15+
}
16+
#endif
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
#if !NET5_0_OR_GREATER
3+
namespace System.Diagnostics.CodeAnalysis
4+
{
5+
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method, Inherited = false)]
6+
internal sealed class RequiresUnreferencedCodeAttribute : Attribute
7+
{
8+
public RequiresUnreferencedCodeAttribute(string message)
9+
{
10+
Message = message;
11+
}
12+
13+
public string Message { get; }
14+
}
15+
}
16+
#endif

src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics.CodeAnalysis;
34
using System.Linq;
45
using System.Reflection;
56
using System.Text.RegularExpressions;
@@ -8,6 +9,7 @@
89

910
namespace Serilog.Settings.Configuration
1011
{
12+
[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)]
1113
class StringArgumentValue : IConfigurationArgumentValue
1214
{
1315
readonly string _providedValue;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
using System.Data;
3+
4+
namespace Serilog
5+
{
6+
internal static class TrimWarningMessages
7+
{
8+
public const string NotSupportedWhenTrimming = "Automatic configuration is not supported when trimming.";
9+
public const string NotSupportedInAot = "Automatic configuration is not supported when AOT compiling.";
10+
public const string UnboundedReflection = "Uses unbounded reflection to load types";
11+
public const string CreatesArraysOfArbitraryTypes = "Creates arrays of arbitrary types";
12+
}
13+
}

0 commit comments

Comments
 (0)