Implementing plugin's external dependencies loading

This commit is contained in:
Zoe Roux 2020-02-29 01:23:08 +01:00
parent fe3407b334
commit 96f5b61b15
2 changed files with 30 additions and 2 deletions

View File

@ -11,7 +11,7 @@
<Company>SDG</Company> <Company>SDG</Company>
<PackageLicenseExpression>GPL-3.0-or-later</PackageLicenseExpression> <PackageLicenseExpression>GPL-3.0-or-later</PackageLicenseExpression>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<PackageVersion>1.0.9</PackageVersion> <PackageVersion>1.0.10</PackageVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -3,12 +3,39 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Runtime.Loader;
using Kyoo.Models; using Kyoo.Models;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Kyoo.Controllers namespace Kyoo.Controllers
{ {
public class PluginDependencyLoader : AssemblyLoadContext
{
private readonly AssemblyDependencyResolver _resolver;
public PluginDependencyLoader(string pluginPath)
{
_resolver = new AssemblyDependencyResolver(pluginPath);
}
protected override Assembly Load(AssemblyName assemblyName)
{
string assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName);
if (assemblyPath != null)
return LoadFromAssemblyPath(assemblyPath);
return base.Load(assemblyName);
}
protected override IntPtr LoadUnmanagedDll(string unmanagedDllName)
{
string libraryPath = _resolver.ResolveUnmanagedDllToPath(unmanagedDllName);
if (libraryPath != null)
return LoadUnmanagedDllFromPath(libraryPath);
return base.LoadUnmanagedDll(unmanagedDllName);
}
}
public class PluginManager : IPluginManager public class PluginManager : IPluginManager
{ {
private readonly IServiceProvider _provider; private readonly IServiceProvider _provider;
@ -47,7 +74,8 @@ namespace Kyoo.Controllers
{ {
try try
{ {
Assembly ass = Assembly.LoadFile(Path.GetFullPath(path)); PluginDependencyLoader loader = new PluginDependencyLoader(Path.GetFullPath(path));
Assembly ass = loader.LoadFromAssemblyPath(Path.GetFullPath(path));
return (from type in ass.GetTypes() return (from type in ass.GetTypes()
where typeof(IPlugin).IsAssignableFrom(type) where typeof(IPlugin).IsAssignableFrom(type)
select (IPlugin) ActivatorUtilities.CreateInstance(_provider, type)).FirstOrDefault(); select (IPlugin) ActivatorUtilities.CreateInstance(_provider, type)).FirstOrDefault();