Explorar o código

Use custom plugin assembly load context

Patrick Barron %!s(int64=2) %!d(string=hai) anos
pai
achega
577d396649

+ 33 - 0
Emby.Server.Implementations/Plugins/PluginLoadContext.cs

@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.Loader;
+
+namespace Emby.Server.Implementations.Plugins;
+
+/// <summary>
+/// A custom <see cref="AssemblyLoadContext"/> for loading Jellyfin plugins.
+/// </summary>
+public class PluginLoadContext : AssemblyLoadContext
+{
+    private readonly AssemblyDependencyResolver _resolver;
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="PluginLoadContext"/> class.
+    /// </summary>
+    /// <param name="path">The path of the plugin assembly.</param>
+    public PluginLoadContext(string path) : base(true)
+    {
+        _resolver = new AssemblyDependencyResolver(path);
+    }
+
+    /// <inheritdoc />
+    protected override Assembly? Load(AssemblyName assemblyName)
+    {
+        var assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName);
+        if (assemblyPath is not null)
+        {
+            return LoadFromAssemblyPath(assemblyPath);
+        }
+
+        return null;
+    }
+}

+ 1 - 1
Emby.Server.Implementations/Plugins/PluginManager.cs

@@ -128,7 +128,7 @@ namespace Emby.Server.Implementations.Plugins
                     Assembly assembly;
                     try
                     {
-                        var assemblyLoadContext = new AssemblyLoadContext($"{plugin.Name} ${plugin.Version}", true);
+                        var assemblyLoadContext = new PluginLoadContext(file);
                         _assemblyLoadContexts.Add(assemblyLoadContext);
 
                         assembly = assemblyLoadContext.LoadFromAssemblyPath(file);