diff --git a/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs b/src/Serilog.Settings.Configuration/ConfigurationLoggerConfigurationExtensions.cs index 2282b1b..b6dea6a 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,9 @@ 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)] + [RequiresAssemblyFiles(TrimWarningMessages.IncompatibleWithSingleFile)] public static LoggerConfiguration ConfigurationSection( this LoggerSettingsConfiguration settingConfiguration, IConfigurationSection configSection, @@ -115,6 +123,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 +149,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 +166,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 +190,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 +214,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 +229,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 +245,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 +254,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 +263,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 bb1c192..2eb653d 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,10 @@ true true snupkg + true + true + true + true @@ -25,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 7fcbe38..c31ed3c 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 38ff3c4..8fc7144 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/Settings/Configuration/ConfigurationReader.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs index 46eca3c..8d6dc97 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/ObjectArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ObjectArgumentValue.cs index 3a15457..04fc193 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/StringArgumentValue.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/StringArgumentValue.cs index ebf3d2e..225da10 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 0000000..65d3333 --- /dev/null +++ b/src/Serilog.Settings.Configuration/TrimWarningMessages.cs @@ -0,0 +1,14 @@ + +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"; + public const string IncompatibleWithSingleFile = "Incompatible with single-file publishing"; + } +} \ No newline at end of file