From b98e589403da7dc87b7b24b4a2b67679e57fbdab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Luthi?= Date: Fri, 5 May 2023 10:50:28 +0200 Subject: [PATCH] Simplify loading assemblies Use a HashSet instead of a Dictionary keyed by the assembly full name. If an assembly is loaded twice with the same AssemblyName it will be the same instance so a HashSet (without even a custom IEqualityComparer) is the perfect solution. Also, Assembly.Load can throw many exceptions but won't return null. This was initially introduced in 74402f836148f746f05a06f87cd8b15fee387155 but merged incorrectly in ac1b8c863307ceb598fbd6457ce9714ff2d1bde3. --- .../Settings/Configuration/ConfigurationReader.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs index 1f8ff5a..6840073 100644 --- a/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs +++ b/src/Serilog.Settings.Configuration/Settings/Configuration/ConfigurationReader.cs @@ -360,7 +360,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 HashSet { serilogAssembly }; var usingSection = section.GetSection("Using"); if (usingSection.GetChildren().Any()) @@ -372,16 +372,14 @@ static IReadOnlyCollection LoadConfigurationAssemblies(IConfiguration $"A zero-length or whitespace assembly name was supplied to a {usingSection.Path} configuration statement."); var assembly = Assembly.Load(new AssemblyName(simpleName)); - if (!assemblies.ContainsKey(assembly.FullName!)) - assemblies.Add(assembly.FullName!, assembly); + assemblies.Add(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); + assemblies.Add(assumed); } if (assemblies.Count == 1) @@ -396,7 +394,7 @@ This is most likely because the application is published as single-file. throw new InvalidOperationException(message); } - return assemblies.Values; + return assemblies; } void CallConfigurationMethods(ILookup> methods, IReadOnlyCollection configurationMethods, object receiver)