Skip to content

Commit 1e5d7bd

Browse files
committed
add class to load assembly and resolve dependencies for each plugin
1 parent 97f7b48 commit 1e5d7bd

File tree

2 files changed

+51
-6
lines changed

2 files changed

+51
-6
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using System;
2+
using System.IO;
3+
using System.Linq;
4+
using System.Reflection;
5+
using System.Runtime.Loader;
6+
7+
namespace Flow.Launcher.Core.Plugin
8+
{
9+
internal class PluginAssemblyLoader : AssemblyLoadContext
10+
{
11+
private readonly AssemblyDependencyResolver dependencyResolver;
12+
13+
private readonly AssemblyName assemblyName;
14+
15+
internal PluginAssemblyLoader(string assemblyFilePath)
16+
{
17+
dependencyResolver = new AssemblyDependencyResolver(assemblyFilePath);
18+
assemblyName = new AssemblyName(Path.GetFileNameWithoutExtension(assemblyFilePath));
19+
}
20+
21+
internal Assembly LoadAssemblyAndDependencies()
22+
{
23+
return LoadFromAssemblyName(assemblyName);
24+
}
25+
26+
protected override Assembly Load(AssemblyName assemblyName)
27+
{
28+
string assemblyPath = dependencyResolver.ResolveAssemblyToPath(assemblyName);
29+
30+
if (assemblyPath != null)
31+
{
32+
return LoadFromAssemblyPath(assemblyPath);
33+
}
34+
35+
return null;
36+
}
37+
38+
internal Type FromAssemblyGetTypeOfInterface(Assembly assembly, Type type)
39+
{
40+
var allTypes = assembly.ExportedTypes;
41+
42+
return allTypes.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Contains(type));
43+
}
44+
}
45+
}

Flow.Launcher.Core/Plugin/PluginsLoader.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,20 +41,20 @@ public static IEnumerable<PluginPair> DotNetPlugins(List<PluginMetadata> source)
4141
{
4242

4343
#if DEBUG
44-
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(metadata.ExecuteFilePath);
45-
var types = assembly.GetTypes();
46-
var type = types.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Contains(typeof(IPlugin)));
44+
var assemblyLoader = new PluginAssemblyLoader(metadata.ExecuteFilePath);
45+
var assembly = assemblyLoader.LoadAssemblyAndDependencies();
46+
var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly, typeof(IPlugin));
4747
var plugin = (IPlugin)Activator.CreateInstance(type);
4848
#else
4949
Assembly assembly = null;
5050
IPlugin plugin = null;
5151

5252
try
5353
{
54-
assembly = AssemblyLoadContext.Default.LoadFromAssemblyPath(metadata.ExecuteFilePath);
54+
var assemblyLoader = new PluginAssemblyLoader(metadata.ExecuteFilePath);
55+
assembly = assemblyLoader.LoadAssemblyAndDependencies();
5556

56-
var types = assembly.GetTypes();
57-
var type = types.First(o => o.IsClass && !o.IsAbstract && o.GetInterfaces().Contains(typeof(IPlugin)));
57+
var type = assemblyLoader.FromAssemblyGetTypeOfInterface(assembly, typeof(IPlugin));
5858

5959
plugin = (IPlugin)Activator.CreateInstance(type);
6060
}

0 commit comments

Comments
 (0)