diff --git a/Bonsai.Configuration/ConfigurationHelper.cs b/Bonsai.Configuration/ConfigurationHelper.cs index 3d2e4b2a..01b722b6 100644 --- a/Bonsai.Configuration/ConfigurationHelper.cs +++ b/Bonsai.Configuration/ConfigurationHelper.cs @@ -2,6 +2,7 @@ using NuGet.Packaging.Core; using NuGet.Versioning; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; @@ -126,45 +127,42 @@ public static void SetAssemblyResolve(PackageConfiguration configuration, bool a AddLibraryPath(path); } - Dictionary assemblyLoadCache = null; - ResolveEventHandler assemblyResolveHandler = (sender, args) => + ConcurrentDictionary resolveCache = new(); + AppDomain.CurrentDomain.AssemblyResolve += (_, args) => { var assemblyName = new AssemblyName(args.Name).Name; + if (resolveCache.TryGetValue(assemblyName, out var assembly)) + return assembly; + var assemblyLocation = GetAssemblyLocation(configuration, assemblyName); if (assemblyLocation != null) { if (assemblyLocation.StartsWith(Uri.UriSchemeFile) && Uri.TryCreate(assemblyLocation, UriKind.Absolute, out Uri uri)) { - assemblyLoadCache ??= new Dictionary(); - if (!assemblyLoadCache.TryGetValue(uri.LocalPath, out Assembly assembly)) - { - var assemblyBytes = File.ReadAllBytes(uri.LocalPath); - assembly = Assembly.Load(assemblyBytes); - assemblyLoadCache.Add(uri.LocalPath, assembly); - } - return assembly; + var assemblyBytes = File.ReadAllBytes(uri.LocalPath); + assembly = Assembly.Load(assemblyBytes); } - - if (!Path.IsPathRooted(assemblyLocation)) + else { - assemblyLocation = Path.Combine(configurationRoot, assemblyLocation); - } + if (!Path.IsPathRooted(assemblyLocation)) + { + assemblyLocation = Path.Combine(configurationRoot, assemblyLocation); + } - if (File.Exists(assemblyLocation)) - { - if (!assemblyLock) + if (File.Exists(assemblyLocation)) { - var assemblyBytes = File.ReadAllBytes(assemblyLocation); - return Assembly.Load(assemblyBytes); + if (!assemblyLock) + { + var assemblyBytes = File.ReadAllBytes(assemblyLocation); + assembly = Assembly.Load(assemblyBytes); + } + else assembly = Assembly.LoadFrom(assemblyLocation); } - else return Assembly.LoadFrom(assemblyLocation); } } - return null; + return resolveCache.GetOrAdd(assemblyName, assembly); }; - - AppDomain.CurrentDomain.AssemblyResolve += assemblyResolveHandler; } public static void SetAssemblyResolve()