ScriptStack 1.0.5
Loading...
Searching...
No Matches
PluginLoadContext.cs
Go to the documentation of this file.
1using System;
2using System.Reflection;
3using System.Runtime.Loader;
4
6{
7 public class PluginLoadContext : AssemblyLoadContext
8 {
9 private readonly AssemblyDependencyResolver _resolver;
10 private readonly string[] _sharedAssemblies;
11
12 public PluginLoadContext(string pluginMainAssemblyPath, string[]? sharedAssemblyNames = null)
13 : base(isCollectible: true)
14 {
15 _resolver = new AssemblyDependencyResolver(pluginMainAssemblyPath);
16 _sharedAssemblies = sharedAssemblyNames ?? Array.Empty<string>();
17 }
18
19 protected override Assembly? Load(AssemblyName assemblyName)
20 {
21 foreach (var shared in _sharedAssemblies)
22 {
23 if (string.Equals(shared, assemblyName.Name, StringComparison.OrdinalIgnoreCase))
24 {
25 try { return Assembly.Load(assemblyName); } catch { return null; }
26 }
27 }
28
29 string? assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName);
30 if (assemblyPath != null)
31 return LoadFromAssemblyPath(assemblyPath);
32
33 return null;
34 }
35
36 protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
37 {
38 string? path = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
39 if (path != null) return LoadUnmanagedDllFromPath(path);
40 return base.LoadUnmanagedDll(unmanagedDllName);
41 }
42 }
43}
44
readonly AssemblyDependencyResolver _resolver
override IntPtr LoadUnmanagedDll(string unmanagedDllName)
override? Assembly Load(AssemblyName assemblyName)
PluginLoadContext(string pluginMainAssemblyPath, string[]? sharedAssemblyNames=null)