From 36379615131021da66870320ff5f3b35d14bfcfd Mon Sep 17 00:00:00 2001 From: Hongtao Zhang Date: Fri, 25 Feb 2022 14:23:40 -0600 Subject: [PATCH 1/2] Fix Shared Assembly Issue --- .../Plugin/PluginAssemblyLoader.cs | 36 +++++-------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs b/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs index 515b0bedcc3..3048cc1e561 100644 --- a/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs +++ b/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs @@ -11,46 +11,31 @@ namespace Flow.Launcher.Core.Plugin { internal class PluginAssemblyLoader : AssemblyLoadContext { - private readonly AssemblyDependencyResolver dependencyResolver; + private readonly AssemblyDependencyResolver _dependencyResolver; - private readonly AssemblyName assemblyName; - - private static readonly ConcurrentDictionary loadedAssembly; - - static PluginAssemblyLoader() - { - var currentAssemblies = AppDomain.CurrentDomain.GetAssemblies(); - loadedAssembly = new ConcurrentDictionary( - currentAssemblies.Select(x => new KeyValuePair(x.FullName, default))); - - AppDomain.CurrentDomain.AssemblyLoad += (sender, args) => - { - loadedAssembly[args.LoadedAssembly.FullName] = default; - }; - } + private readonly AssemblyName _assemblyName; internal PluginAssemblyLoader(string assemblyFilePath) { - dependencyResolver = new AssemblyDependencyResolver(assemblyFilePath); - assemblyName = new AssemblyName(Path.GetFileNameWithoutExtension(assemblyFilePath)); + _dependencyResolver = new AssemblyDependencyResolver(assemblyFilePath); + _assemblyName = new AssemblyName(Path.GetFileNameWithoutExtension(assemblyFilePath)); } internal Assembly LoadAssemblyAndDependencies() { - return LoadFromAssemblyName(assemblyName); + return LoadFromAssemblyName(_assemblyName); } protected override Assembly Load(AssemblyName assemblyName) { - string assemblyPath = dependencyResolver.ResolveAssemblyToPath(assemblyName); + string assemblyPath = _dependencyResolver.ResolveAssemblyToPath(assemblyName); // When resolving dependencies, ignore assembly depenedencies that already exits with Flow.Launcher // Otherwise duplicate assembly will be loaded and some weird behavior will occur, such as WinRT.Runtime.dll // will fail due to loading multiple versions in process, each with their own static instance of registration state - if (assemblyPath == null || ExistsInReferencedPackage(assemblyName)) - return null; + var existAssembly = Default.Assemblies.FirstOrDefault(x => x.FullName == assemblyName.FullName); - return LoadFromAssemblyPath(assemblyPath); + return existAssembly ?? (assemblyPath == null ? null : LoadFromAssemblyPath(assemblyPath)); } internal Type FromAssemblyGetTypeOfInterface(Assembly assembly, Type type) @@ -58,10 +43,5 @@ internal Type FromAssemblyGetTypeOfInterface(Assembly assembly, Type type) var allTypes = assembly.ExportedTypes; return allTypes.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Any(t => t == type)); } - - internal bool ExistsInReferencedPackage(AssemblyName assemblyName) - { - return loadedAssembly.ContainsKey(assemblyName.FullName); - } } } \ No newline at end of file From 60e671ec5a7387eee83671f42f1a0b53705eaf1d Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 2 Mar 2022 08:14:05 +1100 Subject: [PATCH 2/2] formatting --- Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs b/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs index 3048cc1e561..9d76b6be099 100644 --- a/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs +++ b/Flow.Launcher.Core/Plugin/PluginAssemblyLoader.cs @@ -11,24 +11,24 @@ namespace Flow.Launcher.Core.Plugin { internal class PluginAssemblyLoader : AssemblyLoadContext { - private readonly AssemblyDependencyResolver _dependencyResolver; + private readonly AssemblyDependencyResolver dependencyResolver; - private readonly AssemblyName _assemblyName; + private readonly AssemblyName assemblyName; internal PluginAssemblyLoader(string assemblyFilePath) { - _dependencyResolver = new AssemblyDependencyResolver(assemblyFilePath); - _assemblyName = new AssemblyName(Path.GetFileNameWithoutExtension(assemblyFilePath)); + dependencyResolver = new AssemblyDependencyResolver(assemblyFilePath); + assemblyName = new AssemblyName(Path.GetFileNameWithoutExtension(assemblyFilePath)); } internal Assembly LoadAssemblyAndDependencies() { - return LoadFromAssemblyName(_assemblyName); + return LoadFromAssemblyName(assemblyName); } protected override Assembly Load(AssemblyName assemblyName) { - string assemblyPath = _dependencyResolver.ResolveAssemblyToPath(assemblyName); + string assemblyPath = dependencyResolver.ResolveAssemblyToPath(assemblyName); // When resolving dependencies, ignore assembly depenedencies that already exits with Flow.Launcher // Otherwise duplicate assembly will be loaded and some weird behavior will occur, such as WinRT.Runtime.dll