From 44557b66c6b794dc8dbc5e54f2124646da3c1b4e Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Fri, 3 May 2024 06:52:52 +0200 Subject: [PATCH] add IPluginLateInitialization interface --- Pilz.Plugins/IPluginLateInitialization.cs | 13 +++++++++ Pilz.Plugins/PluginManagerT.cs | 32 ++++++++++++----------- 2 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 Pilz.Plugins/IPluginLateInitialization.cs diff --git a/Pilz.Plugins/IPluginLateInitialization.cs b/Pilz.Plugins/IPluginLateInitialization.cs new file mode 100644 index 0000000..c8cb979 --- /dev/null +++ b/Pilz.Plugins/IPluginLateInitialization.cs @@ -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(); + } +} diff --git a/Pilz.Plugins/PluginManagerT.cs b/Pilz.Plugins/PluginManagerT.cs index d6d4577..6186a7d 100644 --- a/Pilz.Plugins/PluginManagerT.cs +++ b/Pilz.Plugins/PluginManagerT.cs @@ -12,19 +12,19 @@ namespace Pilz.Plugins { public class PluginManager where TPluginInterface : class where TPluginRuntimeInfo : PluginRuntimeInfo { - private readonly List loadedPlugins = []; + protected readonly List loadedPlugins = []; /// /// The default initialization parameters used when no parameters passed. Commonly used for dynamically loading assemblies. /// - public object?[] DefaultParameters { get; set; } = []; + public virtual object?[] DefaultParameters { get; set; } = []; /// /// Returns a list of all currently loaded plugins. /// - public IEnumerable LoadedPlugins => loadedPlugins.AsReadOnly(); + public virtual IEnumerable LoadedPlugins => loadedPlugins.AsReadOnly(); - private void CurrentDomain_AssemblyLoad(object? sender, AssemblyLoadEventArgs args) + protected void OnCurrentAppDomainAssemblyLoad(object? sender, AssemblyLoadEventArgs args) { LoadPlugins(args.LoadedAssembly); } @@ -35,7 +35,7 @@ namespace Pilz.Plugins /// /// /// - public IEnumerable> LoadPlugins(string[] paths, params object?[]? parameters) + public virtual IEnumerable> LoadPlugins(string[] paths, params object?[]? parameters) { var results = new List>(); @@ -51,7 +51,7 @@ namespace Pilz.Plugins /// /// /// - public IEnumerable> LoadPlugins(Assembly[] assemblies, params object?[]? parameters) + public virtual IEnumerable> LoadPlugins(Assembly[] assemblies, params object?[]? parameters) { var results = new List>(); @@ -65,7 +65,7 @@ namespace Pilz.Plugins /// Loads plugins from already loaded assemblies for the current . /// /// - public IEnumerable> LoadOwnPlugins(params object?[]? parameters) + public virtual IEnumerable> LoadOwnPlugins(params object?[]? parameters) { return LoadOwnPlugins(false, parameters); } @@ -75,12 +75,12 @@ namespace Pilz.Plugins /// /// Do also load plugins from all yet not loaded assemblies by listening the event . /// - public IEnumerable> LoadOwnPlugins(bool listenAssemblyLoadContext, params object?[]? parameters) + public virtual IEnumerable> LoadOwnPlugins(bool listenAssemblyLoadContext, params object?[]? parameters) { var results = new List>(); if (listenAssemblyLoadContext) - AppDomain.CurrentDomain.AssemblyLoad += CurrentDomain_AssemblyLoad; + AppDomain.CurrentDomain.AssemblyLoad += OnCurrentAppDomainAssemblyLoad; foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) results.Add(LoadPlugins(assembly, parameters)); @@ -94,7 +94,7 @@ namespace Pilz.Plugins /// /// /// - public PluginLoadInfo LoadPlugin(string path, params object?[]? parameters) + public virtual PluginLoadInfo LoadPlugin(string path, params object?[]? parameters) { var result = new PluginLoadInfo(); var loadContext = new PluginLoadContext(path); @@ -125,7 +125,7 @@ namespace Pilz.Plugins /// /// /// - public PluginLoadInfo LoadPlugins(Assembly assembly, params object?[]? parameters) + public virtual PluginLoadInfo LoadPlugins(Assembly assembly, params object?[]? parameters) { var result = new PluginLoadInfo { @@ -144,7 +144,7 @@ namespace Pilz.Plugins /// /// /// - public PluginLoadInfo LoadPlugin(params object?[]? parameters) where TPlugin : TPluginInterface + public virtual PluginLoadInfo LoadPlugin(params object?[]? parameters) where TPlugin : TPluginInterface { var result = new PluginLoadInfo { @@ -156,9 +156,8 @@ namespace Pilz.Plugins return result; } - private void LoadPlugin(PluginLoadInfo result, params object?[]? parameters) + protected void LoadPlugin(PluginLoadInfo result, params object?[]? parameters) { - if (result.Assembly == null) result.Status = PluginLoadStatus.NoValidPlugin; else if (loadedPlugins.Any(n => n.Assembly == result.Assembly)) @@ -173,7 +172,7 @@ namespace Pilz.Plugins result.Status = PluginLoadStatus.NoValidPlugin; } - private void LoadPlugin(PluginLoadInfo result, Type type, params object?[]? parameters) + protected void LoadPlugin(PluginLoadInfo result, Type type, params object?[]? parameters) { if (parameters == null || parameters.Length == 0) parameters = DefaultParameters; @@ -190,6 +189,9 @@ namespace Pilz.Plugins { if (Activator.CreateInstance(type, parameters) is TPluginInterface plugin) { + if (plugin is IPluginLateInitialization pluginLateInit) + pluginLateInit.LateInit(); + info.Plugin = plugin; info.Status = PluginStatus.Success; loadedPlugins.Add(info);