add IPluginLateInitialization interface

This commit is contained in:
2024-05-03 06:52:52 +02:00
parent 2004ba4b30
commit 44557b66c6
2 changed files with 30 additions and 15 deletions

View 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();
}
}

View File

@@ -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);