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); } }