38 lines
1.4 KiB
C#
38 lines
1.4 KiB
C#
using System.Reflection;
|
|
using System.Runtime.Loader;
|
|
using CringeBootstrap.Abstractions;
|
|
|
|
namespace CringePlugins.Loader;
|
|
|
|
internal class PluginAssemblyLoadContext : AssemblyLoadContext
|
|
{
|
|
private readonly ICoreLoadContext _parentContext;
|
|
private readonly string _entrypointPath;
|
|
private readonly AssemblyDependencyResolver _dependencyResolver;
|
|
private Assembly? _assembly;
|
|
|
|
internal PluginAssemblyLoadContext(ICoreLoadContext parentContext, string entrypointPath) : base($"Plugin Context {Path.GetFileNameWithoutExtension(entrypointPath)}", true)
|
|
{
|
|
_parentContext = parentContext;
|
|
_entrypointPath = entrypointPath;
|
|
_dependencyResolver = new(entrypointPath);
|
|
}
|
|
|
|
public Assembly LoadEntrypoint() => _assembly ??= LoadFromAssemblyPath(_entrypointPath);
|
|
|
|
protected override Assembly? Load(AssemblyName assemblyName)
|
|
{
|
|
if (_dependencyResolver.ResolveAssemblyToPath(assemblyName) is { } path)
|
|
return LoadFromAssemblyPath(path);
|
|
|
|
return _parentContext.ResolveFromAssemblyName(assemblyName);
|
|
}
|
|
|
|
protected override nint LoadUnmanagedDll(string unmanagedDllName)
|
|
{
|
|
if (_dependencyResolver.ResolveUnmanagedDllToPath(unmanagedDllName) is { } path)
|
|
return LoadUnmanagedDllFromPath(path);
|
|
|
|
return _parentContext.ResolveUnmanagedDll(unmanagedDllName);
|
|
}
|
|
} |