From c395276d86e00fd79ee4e39975b6705f089946c7 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Fri, 31 Mar 2023 15:27:16 -0700 Subject: [PATCH 1/4] 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. --- ...figurationLoggerConfigurationExtensions.cs | 25 ++++++ .../Serilog.Settings.Configuration.csproj | 4 +- .../Configuration/ConfigurationReader.cs | 21 +++-- .../DynamicallyAccessedMembersAttribute.cs | 85 +++++++++++++++++++ .../Configuration/ObjectArgumentValue.cs | 7 +- .../Configuration/RequiresDynamicCode.cs | 16 ++++ .../RequiresUnreferencedCodeAttribute.cs | 16 ++++ .../Configuration/StringArgumentValue.cs | 4 +- .../TrimWarningMessages.cs | 13 +++ 9 files changed, 183 insertions(+), 8 deletions(-) create mode 100644 src/Serilog.Settings.Configuration/Settings/Configuration/DynamicallyAccessedMembersAttribute.cs create mode 100644 src/Serilog.Settings.Configuration/Settings/Configuration/RequiresDynamicCode.cs create mode 100644 src/Serilog.Settings.Configuration/Settings/Configuration/RequiresUnreferencedCodeAttribute.cs create mode 100644 src/Serilog.Settings.Configuration/TrimWarningMessages.cs diff --git a/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs b/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs index 2282b1bc..dd075675 100644 --- a/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs +++ b/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +using System.Diagnostics.CodeAnalysis; using System.Reflection; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyModel; @@ -43,6 +44,8 @@ public static class ConfigurationLoggerConfigurationExtensions /// default will be used. /// An object allowing configuration to continue. [Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")] + [RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)] + [RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)] public static LoggerConfiguration Configuration( this LoggerSettingsConfiguration settingConfiguration, IConfiguration configuration, @@ -68,6 +71,8 @@ public static LoggerConfiguration Configuration( /// default will be used. /// An object allowing configuration to continue. [Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")] + [RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)] + [RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)] public static LoggerConfiguration Configuration( this LoggerSettingsConfiguration settingConfiguration, IConfiguration configuration, @@ -84,6 +89,8 @@ public static LoggerConfiguration Configuration( /// default will be used. /// An object allowing configuration to continue. [Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, string sectionName, DependencyContext dependencyContext) instead.")] + [RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)] + [RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)] public static LoggerConfiguration ConfigurationSection( this LoggerSettingsConfiguration settingConfiguration, IConfigurationSection configSection, @@ -115,6 +122,8 @@ public static LoggerConfiguration ConfigurationSection( /// Defines how the package identifies assemblies to scan for sinks and other types. /// An object allowing configuration to continue. [Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")] + [RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)] + [RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)] public static LoggerConfiguration Configuration( this LoggerSettingsConfiguration settingConfiguration, IConfiguration configuration, @@ -139,6 +148,8 @@ public static LoggerConfiguration Configuration( /// Defines how the package identifies assemblies to scan for sinks and other types. /// An object allowing configuration to continue. [Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")] + [RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)] + [RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)] public static LoggerConfiguration Configuration( this LoggerSettingsConfiguration settingConfiguration, IConfiguration configuration, @@ -154,6 +165,8 @@ public static LoggerConfiguration Configuration( /// Defines how the package identifies assemblies to scan for sinks and other types. /// An object allowing configuration to continue. [Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, string sectionName, ConfigurationAssemblySource configurationAssemblySource) instead.")] + [RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)] + [RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)] public static LoggerConfiguration ConfigurationSection( this LoggerSettingsConfiguration settingConfiguration, IConfigurationSection configSection, @@ -176,6 +189,8 @@ public static LoggerConfiguration ConfigurationSection( /// A collection of assemblies that contains sinks and other types. /// An object allowing configuration to continue. [Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")] + [RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)] + [RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)] public static LoggerConfiguration Configuration( this LoggerSettingsConfiguration settingConfiguration, IConfiguration configuration, @@ -198,6 +213,8 @@ public static LoggerConfiguration Configuration( /// A collection of assemblies that contains sinks and other types. /// An object allowing configuration to continue. [Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, ConfigurationReaderOptions readerOptions) instead.")] + [RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)] + [RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)] public static LoggerConfiguration Configuration( this LoggerSettingsConfiguration settingConfiguration, IConfiguration configuration, @@ -211,6 +228,8 @@ public static LoggerConfiguration Configuration( /// A configuration object which contains a Serilog section. /// Options to adjust how the configuration object is processed. /// An object allowing configuration to continue. + [RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)] + [RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)] public static LoggerConfiguration Configuration( this LoggerSettingsConfiguration settingConfiguration, IConfiguration configuration, @@ -225,6 +244,8 @@ public static LoggerConfiguration Configuration( return settingConfiguration.Settings(configurationReader); } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] + [RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)] static ConfigurationReader GetConfigurationReader(IConfiguration configuration, ConfigurationReaderOptions readerOptions, DependencyContext? dependencyContext) { var assemblyFinder = dependencyContext == null ? AssemblyFinder.Auto() : AssemblyFinder.ForDependencyContext(dependencyContext); @@ -232,6 +253,8 @@ static ConfigurationReader GetConfigurationReader(IConfiguration configuration, return new ConfigurationReader(section, assemblyFinder, readerOptions, configuration); } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] + [RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)] static ConfigurationReader GetConfigurationReader(IConfiguration configuration, ConfigurationReaderOptions readerOptions, ConfigurationAssemblySource source) { var assemblyFinder = AssemblyFinder.ForSource(source); @@ -239,6 +262,8 @@ static ConfigurationReader GetConfigurationReader(IConfiguration configuration, return new ConfigurationReader(section, assemblyFinder, readerOptions, configuration); } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] + [RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)] static ConfigurationReader GetConfigurationReader(IConfiguration configuration, ConfigurationReaderOptions readerOptions, IReadOnlyCollection assemblies) { var section = string.IsNullOrWhiteSpace(readerOptions.SectionName) ? configuration : configuration.GetSection(readerOptions.SectionName); diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index bb1c1928..de26e7a4 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -4,7 +4,7 @@ Microsoft.Extensions.Configuration (appsettings.json) support for Serilog. 4.0.0 Serilog Contributors - netstandard2.0;net461 + net7.0;netstandard2.0;net461 true Serilog.Settings.Configuration serilog;json @@ -15,6 +15,8 @@ true true snupkg + true + true diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs index 46eca3c9..8d6dc972 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Runtime.CompilerServices; using System.Text.RegularExpressions; @@ -13,6 +14,8 @@ namespace Serilog.Settings.Configuration; +[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] +[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)] class ConfigurationReader : IConfigurationReader { const string LevelSwitchNameRegex = @"^\${0,1}[A-Za-z]+[A-Za-z0-9]*$"; @@ -298,6 +301,7 @@ void ApplyEnrichment(LoggerConfiguration loggerConfiguration) } } + [RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)] internal ILookup> GetMethodCalls(IConfiguration directive) { var children = directive.GetChildren().ToList(); @@ -331,6 +335,7 @@ static string GetSectionName(IConfigurationSection s) } } + [RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)] internal static IConfigurationArgumentValue GetArgumentValue(IConfigurationSection argumentSection, IReadOnlyCollection configurationAssemblies) { IConfigurationArgumentValue argumentValue; @@ -359,7 +364,7 @@ internal static IConfigurationArgumentValue GetArgumentValue(IConfigurationSecti static IReadOnlyCollection LoadConfigurationAssemblies(IConfiguration section, AssemblyFinder assemblyFinder) { var serilogAssembly = typeof(ILogger).Assembly; - var assemblies = new Dictionary { [serilogAssembly.FullName] = serilogAssembly }; + var assemblies = new Dictionary { [serilogAssembly.FullName!] = serilogAssembly }; var usingSection = section.GetSection("Using"); if (usingSection.GetChildren().Any()) @@ -371,16 +376,16 @@ static IReadOnlyCollection LoadConfigurationAssemblies(IConfiguration "A zero-length or whitespace assembly name was supplied to a Serilog.Using configuration statement."); var assembly = Assembly.Load(new AssemblyName(simpleName)); - if (!assemblies.ContainsKey(assembly.FullName)) - assemblies.Add(assembly.FullName, assembly); + if (!assemblies.ContainsKey(assembly.FullName!)) + assemblies.Add(assembly.FullName!, assembly); } } foreach (var assemblyName in assemblyFinder.FindAssembliesContainingName("serilog")) { var assumed = Assembly.Load(assemblyName); - if (assumed != null && !assemblies.ContainsKey(assumed.FullName)) - assemblies.Add(assumed.FullName, assumed); + if (assumed != null && !assemblies.ContainsKey(assumed.FullName!)) + assemblies.Add(assumed.FullName!, assumed); } return assemblies.Values.ToList().AsReadOnly(); @@ -504,6 +509,7 @@ static bool ParameterNameMatches(string? actualParameterName, IEnumerable ParameterNameMatches(actualParameterName, s)); } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] static IReadOnlyCollection FindSinkConfigurationMethods(IReadOnlyCollection configurationAssemblies, bool allowInternalTypes, bool allowInternalMethods) { var found = FindConfigurationExtensionMethods(configurationAssemblies, typeof(LoggerSinkConfiguration), allowInternalTypes, allowInternalMethods); @@ -513,6 +519,7 @@ static IReadOnlyCollection FindSinkConfigurationMethods(IReadOnlyCol return found; } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] static IReadOnlyCollection FindAuditSinkConfigurationMethods(IReadOnlyCollection configurationAssemblies, bool allowInternalTypes, bool allowInternalMethods) { var found = FindConfigurationExtensionMethods(configurationAssemblies, typeof(LoggerAuditSinkConfiguration), allowInternalTypes, allowInternalMethods); @@ -521,6 +528,7 @@ static IReadOnlyCollection FindAuditSinkConfigurationMethods(IReadOn return found; } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] static IReadOnlyCollection FindFilterConfigurationMethods(IReadOnlyCollection configurationAssemblies, bool allowInternalTypes, bool allowInternalMethods) { var found = FindConfigurationExtensionMethods(configurationAssemblies, typeof(LoggerFilterConfiguration), allowInternalTypes, allowInternalMethods); @@ -530,6 +538,7 @@ static IReadOnlyCollection FindFilterConfigurationMethods(IReadOnlyC return found; } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] static IReadOnlyCollection FindDestructureConfigurationMethods(IReadOnlyCollection configurationAssemblies, bool allowInternalTypes, bool allowInternalMethods) { var found = FindConfigurationExtensionMethods(configurationAssemblies, typeof(LoggerDestructuringConfiguration), allowInternalTypes, allowInternalMethods); @@ -539,6 +548,7 @@ static IReadOnlyCollection FindDestructureConfigurationMethods(IRead return found; } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] static IReadOnlyCollection FindEventEnricherConfigurationMethods(IReadOnlyCollection configurationAssemblies, bool allowInternalTypes, bool allowInternalMethods) { var found = FindConfigurationExtensionMethods(configurationAssemblies, typeof(LoggerEnrichmentConfiguration), allowInternalTypes, allowInternalMethods); @@ -548,6 +558,7 @@ static IReadOnlyCollection FindEventEnricherConfigurationMethods(IRe return found; } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] static List FindConfigurationExtensionMethods(IReadOnlyCollection configurationAssemblies, Type configType, bool allowInternalTypes, bool allowInternalMethods) { // ExtensionAttribute can be polyfilled to support extension methods diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/DynamicallyAccessedMembersAttribute.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/DynamicallyAccessedMembersAttribute.cs new file mode 100644 index 00000000..ca51ff57 --- /dev/null +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/DynamicallyAccessedMembersAttribute.cs @@ -0,0 +1,85 @@ + +#if !NET6_0_OR_GREATER +namespace System.Diagnostics.CodeAnalysis +{ + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, Inherited = false)] + internal sealed class DynamicallyAccessedMembersAttribute : Attribute + { + public DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes memberTypes) + { + MemberTypes = memberTypes; + } + + public DynamicallyAccessedMemberTypes MemberTypes { get; } + } + + [Flags] + internal enum DynamicallyAccessedMemberTypes + { + // + // Summary: + // Specifies all members. + All = -1, + // + // Summary: + // Specifies no members. + None = 0, + // + // Summary: + // Specifies the default, parameterless public constructor. + PublicParameterlessConstructor = 1, + // + // Summary: + // Specifies all public constructors. + PublicConstructors = 3, + // + // Summary: + // Specifies all non-public constructors. + NonPublicConstructors = 4, + // + // Summary: + // Specifies all public methods. + PublicMethods = 8, + // + // Summary: + // Specifies all non-public methods. + NonPublicMethods = 16, + // + // Summary: + // Specifies all public fields. + PublicFields = 32, + // + // Summary: + // Specifies all non-public fields. + NonPublicFields = 64, + // + // Summary: + // Specifies all public nested types. + PublicNestedTypes = 128, + // + // Summary: + // Specifies all non-public nested types. + NonPublicNestedTypes = 256, + // + // Summary: + // Specifies all public properties. + PublicProperties = 512, + // + // Summary: + // Specifies all non-public properties. + NonPublicProperties = 1024, + // + // Summary: + // Specifies all public events. + PublicEvents = 2048, + // + // Summary: + // Specifies all non-public events. + NonPublicEvents = 4096, + // + // Summary: + // Specifies all interfaces implemented by the type. + Interfaces = 8192 + } +} +#endif \ No newline at end of file diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs index 3a154573..04fc193e 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs @@ -8,6 +8,8 @@ namespace Serilog.Settings.Configuration; +[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] +[RequiresDynamicCode(TrimWarningMessages.CreatesArraysOfArbitraryTypes)] class ObjectArgumentValue : IConfigurationArgumentValue { readonly IConfigurationSection _section; @@ -98,6 +100,7 @@ bool TryCreateContainer([NotNullWhen(true)] out object? result) } } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] internal static bool TryBuildCtorExpression( IConfigurationSection section, Type parameterType, ResolutionContext resolutionContext, [NotNullWhen(true)] out NewExpression? ctorExpression) { @@ -218,7 +221,9 @@ static bool TryBindToCtorArgument(object value, Type type, ResolutionContext res } } - static bool IsContainer(Type type, [NotNullWhen(true)] out Type? elementType) + static bool IsContainer( + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.Interfaces)] Type type, + [NotNullWhen(true)] out Type? elementType) { elementType = null; foreach (var iface in type.GetInterfaces()) diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresDynamicCode.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresDynamicCode.cs new file mode 100644 index 00000000..f513c98f --- /dev/null +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresDynamicCode.cs @@ -0,0 +1,16 @@ +#if !NET6_0_OR_GREATER + +namespace System.Diagnostics.CodeAnalysis +{ + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method, Inherited = false)] + internal sealed class RequiresDynamicCodeAttribute : Attribute + { + public RequiresDynamicCodeAttribute(string message) + { + Message = message; + } + + public string Message { get; } + } +} +#endif \ No newline at end of file diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresUnreferencedCodeAttribute.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresUnreferencedCodeAttribute.cs new file mode 100644 index 00000000..88458cfd --- /dev/null +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresUnreferencedCodeAttribute.cs @@ -0,0 +1,16 @@ + +#if !NET5_0_OR_GREATER +namespace System.Diagnostics.CodeAnalysis +{ + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method, Inherited = false)] + internal sealed class RequiresUnreferencedCodeAttribute : Attribute + { + public RequiresUnreferencedCodeAttribute(string message) + { + Message = message; + } + + public string Message { get; } + } +} +#endif \ No newline at end of file diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs index ebf3d2ea..225da104 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; using System.Reflection; using System.Text.RegularExpressions; @@ -6,6 +6,7 @@ namespace Serilog.Settings.Configuration; +[RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] class StringArgumentValue : IConfigurationArgumentValue { readonly string _providedValue; @@ -157,6 +158,7 @@ public StringArgumentValue(string providedValue) return Convert.ChangeType(argumentValue, toType, resolutionContext.ReaderOptions.FormatProvider); } + [RequiresUnreferencedCode(TrimWarningMessages.UnboundedReflection)] internal static Type? FindType(string typeName) { var type = Type.GetType(typeName); diff --git a/src/Serilog.Settings.Configuration/TrimWarningMessages.cs b/src/Serilog.Settings.Configuration/TrimWarningMessages.cs new file mode 100644 index 00000000..b43287fa --- /dev/null +++ b/src/Serilog.Settings.Configuration/TrimWarningMessages.cs @@ -0,0 +1,13 @@ + +using System.Data; + +namespace Serilog +{ + internal static class TrimWarningMessages + { + public const string NotSupportedWhenTrimming = "Automatic configuration is not supported when trimming."; + public const string NotSupportedInAot = "Automatic configuration is not supported when AOT compiling."; + public const string UnboundedReflection = "Uses unbounded reflection to load types"; + public const string CreatesArraysOfArbitraryTypes = "Creates arrays of arbitrary types"; + } +} \ No newline at end of file From 784ebfcdcd2d44b5c09a45db00fc2b46eb958107 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Mon, 3 Apr 2023 09:56:00 -0700 Subject: [PATCH 2/4] Enable attribute generation through PolySharp --- .../Serilog.Settings.Configuration.csproj | 1 + .../DynamicallyAccessedMembersAttribute.cs | 85 ------------------- .../Configuration/RequiresDynamicCode.cs | 16 ---- .../RequiresUnreferencedCodeAttribute.cs | 16 ---- 4 files changed, 1 insertion(+), 117 deletions(-) delete mode 100644 src/Serilog.Settings.Configuration/Settings/Configuration/DynamicallyAccessedMembersAttribute.cs delete mode 100644 src/Serilog.Settings.Configuration/Settings/Configuration/RequiresDynamicCode.cs delete mode 100644 src/Serilog.Settings.Configuration/Settings/Configuration/RequiresUnreferencedCodeAttribute.cs diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index de26e7a4..592e25fb 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -17,6 +17,7 @@ snupkg true true + true diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/DynamicallyAccessedMembersAttribute.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/DynamicallyAccessedMembersAttribute.cs deleted file mode 100644 index ca51ff57..00000000 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/DynamicallyAccessedMembersAttribute.cs +++ /dev/null @@ -1,85 +0,0 @@ - -#if !NET6_0_OR_GREATER -namespace System.Diagnostics.CodeAnalysis -{ - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, Inherited = false)] - internal sealed class DynamicallyAccessedMembersAttribute : Attribute - { - public DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes memberTypes) - { - MemberTypes = memberTypes; - } - - public DynamicallyAccessedMemberTypes MemberTypes { get; } - } - - [Flags] - internal enum DynamicallyAccessedMemberTypes - { - // - // Summary: - // Specifies all members. - All = -1, - // - // Summary: - // Specifies no members. - None = 0, - // - // Summary: - // Specifies the default, parameterless public constructor. - PublicParameterlessConstructor = 1, - // - // Summary: - // Specifies all public constructors. - PublicConstructors = 3, - // - // Summary: - // Specifies all non-public constructors. - NonPublicConstructors = 4, - // - // Summary: - // Specifies all public methods. - PublicMethods = 8, - // - // Summary: - // Specifies all non-public methods. - NonPublicMethods = 16, - // - // Summary: - // Specifies all public fields. - PublicFields = 32, - // - // Summary: - // Specifies all non-public fields. - NonPublicFields = 64, - // - // Summary: - // Specifies all public nested types. - PublicNestedTypes = 128, - // - // Summary: - // Specifies all non-public nested types. - NonPublicNestedTypes = 256, - // - // Summary: - // Specifies all public properties. - PublicProperties = 512, - // - // Summary: - // Specifies all non-public properties. - NonPublicProperties = 1024, - // - // Summary: - // Specifies all public events. - PublicEvents = 2048, - // - // Summary: - // Specifies all non-public events. - NonPublicEvents = 4096, - // - // Summary: - // Specifies all interfaces implemented by the type. - Interfaces = 8192 - } -} -#endif \ No newline at end of file diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresDynamicCode.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresDynamicCode.cs deleted file mode 100644 index f513c98f..00000000 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresDynamicCode.cs +++ /dev/null @@ -1,16 +0,0 @@ -#if !NET6_0_OR_GREATER - -namespace System.Diagnostics.CodeAnalysis -{ - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method, Inherited = false)] - internal sealed class RequiresDynamicCodeAttribute : Attribute - { - public RequiresDynamicCodeAttribute(string message) - { - Message = message; - } - - public string Message { get; } - } -} -#endif \ No newline at end of file diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresUnreferencedCodeAttribute.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresUnreferencedCodeAttribute.cs deleted file mode 100644 index 88458cfd..00000000 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/RequiresUnreferencedCodeAttribute.cs +++ /dev/null @@ -1,16 +0,0 @@ - -#if !NET5_0_OR_GREATER -namespace System.Diagnostics.CodeAnalysis -{ - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor | AttributeTargets.Method, Inherited = false)] - internal sealed class RequiresUnreferencedCodeAttribute : Attribute - { - public RequiresUnreferencedCodeAttribute(string message) - { - Message = message; - } - - public string Message { get; } - } -} -#endif \ No newline at end of file From 48c6dc0957f2dda223fe1dd01d535f131791c0fa Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Mon, 3 Apr 2023 10:57:59 -0700 Subject: [PATCH 3/4] Enable SingleFileAnalyzer --- .../Serilog.Settings.Configuration.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index 592e25fb..a7880c53 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -17,6 +17,7 @@ snupkg true true + true true From 33bb6b0c04fd73ee4997c5139d814ab31e724165 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Tue, 25 Apr 2023 13:11:24 -0700 Subject: [PATCH 4/4] Annotate for single-file --- .../ConfigurationLoggerConfigurationExtensions.cs | 1 + .../Serilog.Settings.Configuration.csproj | 2 +- .../Settings/Configuration/Assemblies/AssemblyFinder.cs | 4 +++- .../Configuration/Assemblies/DllScanningAssemblyFinder.cs | 2 ++ src/Serilog.Settings.Configuration/TrimWarningMessages.cs | 1 + 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs b/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs index dd075675..b6dea6a7 100644 --- a/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs +++ b/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs @@ -91,6 +91,7 @@ public static LoggerConfiguration Configuration( [Obsolete("Use ReadFrom.Configuration(IConfiguration configuration, string sectionName, DependencyContext dependencyContext) instead.")] [RequiresUnreferencedCode(TrimWarningMessages.NotSupportedWhenTrimming)] [RequiresDynamicCode(TrimWarningMessages.NotSupportedInAot)] + [RequiresAssemblyFiles(TrimWarningMessages.IncompatibleWithSingleFile)] public static LoggerConfiguration ConfigurationSection( this LoggerSettingsConfiguration settingConfiguration, IConfigurationSection configSection, diff --git a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj index a7880c53..2eb653d0 100644 --- a/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj +++ b/src/Serilog.Settings.Configuration/Serilog.Settings.Configuration.csproj @@ -29,7 +29,7 @@ - + diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/AssemblyFinder.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/AssemblyFinder.cs index 7fcbe383..c31ed3ca 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/AssemblyFinder.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/AssemblyFinder.cs @@ -1,4 +1,5 @@ -using System.Reflection; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; using Microsoft.Extensions.DependencyModel; namespace Serilog.Settings.Configuration.Assemblies; @@ -12,6 +13,7 @@ protected static bool IsCaseInsensitiveMatch(string? text, string textToFind) return text != null && text.ToLowerInvariant().Contains(textToFind.ToLowerInvariant()); } + [RequiresAssemblyFiles(TrimWarningMessages.IncompatibleWithSingleFile)] public static AssemblyFinder Auto() { try diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs index 38ff3c4a..8fc7144e 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/Assemblies/DllScanningAssemblyFinder.cs @@ -1,9 +1,11 @@ +using System.Diagnostics.CodeAnalysis; using System.Reflection; namespace Serilog.Settings.Configuration.Assemblies; sealed class DllScanningAssemblyFinder : AssemblyFinder { + [RequiresAssemblyFiles(TrimWarningMessages.IncompatibleWithSingleFile)] public override IReadOnlyList FindAssembliesContainingName(string nameToFind) { var probeDirs = new List(); diff --git a/src/Serilog.Settings.Configuration/TrimWarningMessages.cs b/src/Serilog.Settings.Configuration/TrimWarningMessages.cs index b43287fa..65d3333e 100644 --- a/src/Serilog.Settings.Configuration/TrimWarningMessages.cs +++ b/src/Serilog.Settings.Configuration/TrimWarningMessages.cs @@ -9,5 +9,6 @@ internal static class TrimWarningMessages public const string NotSupportedInAot = "Automatic configuration is not supported when AOT compiling."; public const string UnboundedReflection = "Uses unbounded reflection to load types"; public const string CreatesArraysOfArbitraryTypes = "Creates arrays of arbitrary types"; + public const string IncompatibleWithSingleFile = "Incompatible with single-file publishing"; } } \ No newline at end of file