add IPluginLateInitialization interface
This commit is contained in:
13
Pilz.Plugins/IPluginLateInitialization.cs
Normal file
13
Pilz.Plugins/IPluginLateInitialization.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Pilz.Plugins
|
||||||
|
{
|
||||||
|
public interface IPluginLateInitialization
|
||||||
|
{
|
||||||
|
abstract void LateInit();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,19 +12,19 @@ namespace Pilz.Plugins
|
|||||||
{
|
{
|
||||||
public class PluginManager<TPluginInterface, TPluginRuntimeInfo> where TPluginInterface : class where TPluginRuntimeInfo : PluginRuntimeInfo<TPluginInterface>
|
public class PluginManager<TPluginInterface, TPluginRuntimeInfo> where TPluginInterface : class where TPluginRuntimeInfo : PluginRuntimeInfo<TPluginInterface>
|
||||||
{
|
{
|
||||||
private readonly List<TPluginRuntimeInfo> loadedPlugins = [];
|
protected readonly List<TPluginRuntimeInfo> loadedPlugins = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The default initialization parameters used when no parameters passed. Commonly used for dynamically loading assemblies.
|
/// The default initialization parameters used when no parameters passed. Commonly used for dynamically loading assemblies.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public object?[] DefaultParameters { get; set; } = [];
|
public virtual object?[] DefaultParameters { get; set; } = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a list of all currently loaded plugins.
|
/// Returns a list of all currently loaded plugins.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IEnumerable<TPluginRuntimeInfo> LoadedPlugins => loadedPlugins.AsReadOnly();
|
public virtual IEnumerable<TPluginRuntimeInfo> LoadedPlugins => loadedPlugins.AsReadOnly();
|
||||||
|
|
||||||
private void CurrentDomain_AssemblyLoad(object? sender, AssemblyLoadEventArgs args)
|
protected void OnCurrentAppDomainAssemblyLoad(object? sender, AssemblyLoadEventArgs args)
|
||||||
{
|
{
|
||||||
LoadPlugins(args.LoadedAssembly);
|
LoadPlugins(args.LoadedAssembly);
|
||||||
}
|
}
|
||||||
@@ -35,7 +35,7 @@ namespace Pilz.Plugins
|
|||||||
/// <param name="paths"></param>
|
/// <param name="paths"></param>
|
||||||
/// <param name="parameters"></param>
|
/// <param name="parameters"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>> LoadPlugins(string[] paths, params object?[]? parameters)
|
public virtual IEnumerable<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>> LoadPlugins(string[] paths, params object?[]? parameters)
|
||||||
{
|
{
|
||||||
var results = new List<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>>();
|
var results = new List<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>>();
|
||||||
|
|
||||||
@@ -51,7 +51,7 @@ namespace Pilz.Plugins
|
|||||||
/// <param name="paths"></param>
|
/// <param name="paths"></param>
|
||||||
/// <param name="parameters"></param>
|
/// <param name="parameters"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>> LoadPlugins(Assembly[] assemblies, params object?[]? parameters)
|
public virtual IEnumerable<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>> LoadPlugins(Assembly[] assemblies, params object?[]? parameters)
|
||||||
{
|
{
|
||||||
var results = new List<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>>();
|
var results = new List<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>>();
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ namespace Pilz.Plugins
|
|||||||
/// Loads plugins from already loaded assemblies for the current <see cref="AppDomain.CurrentDomain"/>.
|
/// Loads plugins from already loaded assemblies for the current <see cref="AppDomain.CurrentDomain"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>> LoadOwnPlugins(params object?[]? parameters)
|
public virtual IEnumerable<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>> LoadOwnPlugins(params object?[]? parameters)
|
||||||
{
|
{
|
||||||
return LoadOwnPlugins(false, parameters);
|
return LoadOwnPlugins(false, parameters);
|
||||||
}
|
}
|
||||||
@@ -75,12 +75,12 @@ namespace Pilz.Plugins
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="listenAssemblyLoadContext">Do also load plugins from all yet not loaded assemblies by listening the event <see cref="AppDomain.AssemblyLoad"/>.
|
/// <param name="listenAssemblyLoadContext">Do also load plugins from all yet not loaded assemblies by listening the event <see cref="AppDomain.AssemblyLoad"/>.
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public IEnumerable<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>> LoadOwnPlugins(bool listenAssemblyLoadContext, params object?[]? parameters)
|
public virtual IEnumerable<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>> LoadOwnPlugins(bool listenAssemblyLoadContext, params object?[]? parameters)
|
||||||
{
|
{
|
||||||
var results = new List<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>>();
|
var results = new List<PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>>();
|
||||||
|
|
||||||
if (listenAssemblyLoadContext)
|
if (listenAssemblyLoadContext)
|
||||||
AppDomain.CurrentDomain.AssemblyLoad += CurrentDomain_AssemblyLoad;
|
AppDomain.CurrentDomain.AssemblyLoad += OnCurrentAppDomainAssemblyLoad;
|
||||||
|
|
||||||
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
|
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
|
||||||
results.Add(LoadPlugins(assembly, parameters));
|
results.Add(LoadPlugins(assembly, parameters));
|
||||||
@@ -94,7 +94,7 @@ namespace Pilz.Plugins
|
|||||||
/// <param name="path"></param>
|
/// <param name="path"></param>
|
||||||
/// <param name="parameters"></param>
|
/// <param name="parameters"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo> LoadPlugin(string path, params object?[]? parameters)
|
public virtual PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo> LoadPlugin(string path, params object?[]? parameters)
|
||||||
{
|
{
|
||||||
var result = new PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>();
|
var result = new PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>();
|
||||||
var loadContext = new PluginLoadContext(path);
|
var loadContext = new PluginLoadContext(path);
|
||||||
@@ -125,7 +125,7 @@ namespace Pilz.Plugins
|
|||||||
/// <param name="assembly"></param>
|
/// <param name="assembly"></param>
|
||||||
/// <param name="parameters"></param>
|
/// <param name="parameters"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo> LoadPlugins(Assembly assembly, params object?[]? parameters)
|
public virtual PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo> LoadPlugins(Assembly assembly, params object?[]? parameters)
|
||||||
{
|
{
|
||||||
var result = new PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>
|
var result = new PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>
|
||||||
{
|
{
|
||||||
@@ -144,7 +144,7 @@ namespace Pilz.Plugins
|
|||||||
/// <typeparam name="TPlugin"></typeparam>
|
/// <typeparam name="TPlugin"></typeparam>
|
||||||
/// <param name="parameters"></param>
|
/// <param name="parameters"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo> LoadPlugin<TPlugin>(params object?[]? parameters) where TPlugin : TPluginInterface
|
public virtual PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo> LoadPlugin<TPlugin>(params object?[]? parameters) where TPlugin : TPluginInterface
|
||||||
{
|
{
|
||||||
var result = new PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>
|
var result = new PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo>
|
||||||
{
|
{
|
||||||
@@ -156,9 +156,8 @@ namespace Pilz.Plugins
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadPlugin(PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo> result, params object?[]? parameters)
|
protected void LoadPlugin(PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo> result, params object?[]? parameters)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (result.Assembly == null)
|
if (result.Assembly == null)
|
||||||
result.Status = PluginLoadStatus.NoValidPlugin;
|
result.Status = PluginLoadStatus.NoValidPlugin;
|
||||||
else if (loadedPlugins.Any(n => n.Assembly == result.Assembly))
|
else if (loadedPlugins.Any(n => n.Assembly == result.Assembly))
|
||||||
@@ -173,7 +172,7 @@ namespace Pilz.Plugins
|
|||||||
result.Status = PluginLoadStatus.NoValidPlugin;
|
result.Status = PluginLoadStatus.NoValidPlugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LoadPlugin(PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo> result, Type type, params object?[]? parameters)
|
protected void LoadPlugin(PluginLoadInfo<TPluginInterface, TPluginRuntimeInfo> result, Type type, params object?[]? parameters)
|
||||||
{
|
{
|
||||||
if (parameters == null || parameters.Length == 0)
|
if (parameters == null || parameters.Length == 0)
|
||||||
parameters = DefaultParameters;
|
parameters = DefaultParameters;
|
||||||
@@ -190,6 +189,9 @@ namespace Pilz.Plugins
|
|||||||
{
|
{
|
||||||
if (Activator.CreateInstance(type, parameters) is TPluginInterface plugin)
|
if (Activator.CreateInstance(type, parameters) is TPluginInterface plugin)
|
||||||
{
|
{
|
||||||
|
if (plugin is IPluginLateInitialization pluginLateInit)
|
||||||
|
pluginLateInit.LateInit();
|
||||||
|
|
||||||
info.Plugin = plugin;
|
info.Plugin = plugin;
|
||||||
info.Status = PluginStatus.Success;
|
info.Status = PluginStatus.Success;
|
||||||
loadedPlugins.Add(info);
|
loadedPlugins.Add(info);
|
||||||
|
|||||||
Reference in New Issue
Block a user