feature: first
All checks were successful
Build / Compute Version (push) Successful in 4s
Build / Build Nuget package (CringeBootstrap.Abstractions) (push) Successful in 2m47s
Build / Build Nuget package (CringePlugins) (push) Successful in 5m31s
Build / Build Nuget package (NuGet) (push) Successful in 6m2s
Build / Build Nuget package (SharedCringe) (push) Successful in 7m25s
Build / Build Launcher (push) Successful in 9m11s

This commit is contained in:
zznty
2022-10-28 01:58:54 +07:00
commit aa979e9519
81 changed files with 6162 additions and 0 deletions

View File

@@ -0,0 +1,37 @@
using System.Reflection;
using System.Runtime.Loader;
using CringeBootstrap.Abstractions;
using SharedCringe.Loader;
namespace CringePlugins.Loader;
internal class PluginAssemblyLoadContext : DerivedAssemblyLoadContext
{
private readonly string _entrypointPath;
private readonly AssemblyDependencyResolver _dependencyResolver;
private Assembly? _assembly;
internal PluginAssemblyLoadContext(ICoreLoadContext parentContext, string entrypointPath) : base(parentContext, $"Plugin Context {Path.GetFileNameWithoutExtension(entrypointPath)}")
{
_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 base.Load(assemblyName);
}
protected override nint LoadUnmanagedDll(string unmanagedDllName)
{
if (_dependencyResolver.ResolveUnmanagedDllToPath(unmanagedDllName) is { } path)
return LoadUnmanagedDllFromPath(path);
return base.LoadUnmanagedDll(unmanagedDllName);
}
}