diff --git a/CringeLauncher/Patches/IntrospectionPatches.cs b/CringeLauncher/Patches/IntrospectionPatches.cs index 20442b1..f647dc4 100644 --- a/CringeLauncher/Patches/IntrospectionPatches.cs +++ b/CringeLauncher/Patches/IntrospectionPatches.cs @@ -21,6 +21,7 @@ using VRage.ModAPI; using VRage.ObjectBuilders; using VRage.ObjectBuilders.Private; using VRage.Plugins; +using CringePlugins.Loader; namespace CringeLauncher.Patches; @@ -80,7 +81,8 @@ public static class IntrospectionPatches [HarmonyPrefix, HarmonyPatch(typeof(AccessTools), nameof(AccessTools.AllAssemblies))] private static bool AllAssembliesHarmonyPrefix(ref IEnumerable __result) { - __result = AssemblyLoadContext.GetLoadContext(typeof(IntrospectionPatches).Assembly)?.Assemblies ?? []; + __result = AssemblyLoadContext.GetLoadContext(typeof(IntrospectionPatches).Assembly)?.Assemblies + .Concat(PluginsLifetime.Contexts.SelectMany(x => x.Assemblies)) ?? []; return false; } diff --git a/CringePlugins/Loader/PluginInstance.cs b/CringePlugins/Loader/PluginInstance.cs index 33ec15c..799f6f3 100644 --- a/CringePlugins/Loader/PluginInstance.cs +++ b/CringePlugins/Loader/PluginInstance.cs @@ -1,6 +1,8 @@ -using System.Runtime.Loader; +using System.Collections.Immutable; +using System.Runtime.Loader; using CringeBootstrap.Abstractions; using CringePlugins.Utils; +using SharedCringe.Loader; using VRage.Plugins; namespace CringePlugins.Loader; @@ -26,12 +28,13 @@ internal sealed class PluginInstance { } - public void Instantiate() + public void Instantiate(ImmutableArray.Builder contextBuilder) { if (AssemblyLoadContext.GetLoadContext(typeof(PluginInstance).Assembly) is not ICoreLoadContext parentContext) throw new NotSupportedException("Plugin instantiation is not supported in this context"); _context = new PluginAssemblyLoadContext(parentContext, _entrypointPath); + contextBuilder.Add(_context); var entrypoint = _context.LoadEntrypoint(); diff --git a/CringePlugins/Loader/PluginsLifetime.cs b/CringePlugins/Loader/PluginsLifetime.cs index c6afe82..2981909 100644 --- a/CringePlugins/Loader/PluginsLifetime.cs +++ b/CringePlugins/Loader/PluginsLifetime.cs @@ -11,11 +11,14 @@ using NuGet; using NuGet.Deps; using NuGet.Frameworks; using NuGet.Versioning; +using SharedCringe.Loader; namespace CringePlugins.Loader; public class PluginsLifetime : ILoadingStage { + public static ImmutableArray Contexts { get; private set; } = []; + private static readonly Logger Log = LogManager.GetCurrentClassLogger(); public string Name => "Loading Plugins"; @@ -71,11 +74,12 @@ public class PluginsLifetime : ILoadingStage private void RegisterLifetime() { + var contextBuilder = Contexts.ToBuilder(); foreach (var instance in _plugins) { try { - instance.Instantiate(); + instance.Instantiate(contextBuilder); instance.RegisterLifetime(); } catch (Exception e) @@ -83,6 +87,7 @@ public class PluginsLifetime : ILoadingStage Log.Error(e, "Failed to instantiate plugin {Plugin}", instance.Metadata); } } + Contexts = contextBuilder.ToImmutable(); } private async Task LoadPlugins(IReadOnlySet packages, PackageSourceMapping sourceMapping,