File tree Expand file tree Collapse file tree 2 files changed +51
-6
lines changed
Flow.Launcher.Core/Plugin Expand file tree Collapse file tree 2 files changed +51
-6
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change @@ -41,20 +41,20 @@ public static IEnumerable<PluginPair> DotNetPlugins(List<PluginMetadata> source)
41
41
{
42
42
43
43
#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 ) ) ;
47
47
var plugin = ( IPlugin ) Activator . CreateInstance ( type ) ;
48
48
#else
49
49
Assembly assembly = null ;
50
50
IPlugin plugin = null ;
51
51
52
52
try
53
53
{
54
- assembly = AssemblyLoadContext . Default . LoadFromAssemblyPath ( metadata . ExecuteFilePath ) ;
54
+ var assemblyLoader = new PluginAssemblyLoader ( metadata . ExecuteFilePath ) ;
55
+ assembly = assemblyLoader . LoadAssemblyAndDependencies ( ) ;
55
56
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 ) ) ;
58
58
59
59
plugin = ( IPlugin ) Activator . CreateInstance ( type ) ;
60
60
}
You can’t perform that action at this time.
0 commit comments