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>
<PackageLicenseExpression>GPL-3.0-or-later</PackageLicenseExpression>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<PackageVersion>1.0.9</PackageVersion>
<PackageVersion>1.0.10</PackageVersion>
</PropertyGroup>
<ItemGroup>

View File

@ -3,12 +3,39 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
using Kyoo.Models;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
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
{
private readonly IServiceProvider _provider;
@ -47,7 +74,8 @@ namespace Kyoo.Controllers
{
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()
where typeof(IPlugin).IsAssignableFrom(type)
select (IPlugin) ActivatorUtilities.CreateInstance(_provider, type)).FirstOrDefault();