diff --git a/Pilz.Plugins/PluginLoadInfo.cs b/Pilz.Plugins/PluginLoadInfo.cs new file mode 100644 index 0000000..7556f08 --- /dev/null +++ b/Pilz.Plugins/PluginLoadInfo.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Pilz.Plugins +{ + public class PluginLoadInfo where TPluginInterface : class where TPluginRuntimeInfo : PluginRuntimeInfo + { + internal List PluginsInternal { get; } = []; + public Assembly Assembly { get; internal set; } + public PluginLoadStatus Status { get; internal set; } + public IEnumerable Plugins => PluginsInternal.AsReadOnly(); + } +} diff --git a/Pilz.Plugins/PluginLoadStatus.cs b/Pilz.Plugins/PluginLoadStatus.cs new file mode 100644 index 0000000..1af7dc8 --- /dev/null +++ b/Pilz.Plugins/PluginLoadStatus.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Pilz.Plugins +{ + public enum PluginLoadStatus + { + None, + Success, + AlreadyLoaded, + ErrorAtLoading, + FileNotFound, + NoValidPlugin + } +} diff --git a/Pilz.Plugins/PluginManagerT.cs b/Pilz.Plugins/PluginManagerT.cs index 1603c2d..e2cf857 100644 --- a/Pilz.Plugins/PluginManagerT.cs +++ b/Pilz.Plugins/PluginManagerT.cs @@ -28,7 +28,7 @@ namespace Pilz.Plugins /// /// /// - public IEnumerable LoadPlugins(string[] paths, params object?[]? parameters) + public IEnumerable> LoadPlugins(string[] paths, params object?[]? parameters) { foreach (var path in paths) yield return LoadPlugin(path, parameters); @@ -40,7 +40,7 @@ namespace Pilz.Plugins /// /// /// - public IEnumerable LoadPlugins(Assembly[] assemblies, params object?[]? parameters) + public IEnumerable> LoadPlugins(Assembly[] assemblies, params object?[]? parameters) { foreach (var assembly in assemblies) yield return LoadPlugin(assembly, parameters); @@ -51,7 +51,7 @@ 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 IEnumerable> LoadOwnPlugins(bool listenAssemblyLoadContext, params object?[]? parameters) { if (listenAssemblyLoadContext) AppDomain.CurrentDomain.AssemblyLoad += CurrentDomain_AssemblyLoad; @@ -66,29 +66,29 @@ namespace Pilz.Plugins /// /// /// - public TPluginRuntimeInfo LoadPlugin(string path, params object?[]? parameters) + public PluginLoadInfo LoadPlugin(string path, params object?[]? parameters) { - var info = Activator.CreateInstance(); + var result = new PluginLoadInfo(); var loadContext = new PluginLoadContext(path); if (File.Exists(path)) { try { - info.Assembly = loadContext.LoadFromAssemblyName(new AssemblyName(Path.GetFileNameWithoutExtension(path))); + result.Assembly = loadContext.LoadFromAssemblyName(new AssemblyName(Path.GetFileNameWithoutExtension(path))); } catch { - info.Status = PluginStatus.ErrorAtLoading; + result.Status = PluginLoadStatus.ErrorAtLoading; } } else - info.Status = PluginStatus.FileNotFound; + result.Status = PluginLoadStatus.FileNotFound; - if (info.Assembly != null) - info = LoadPlugin(info.Assembly, parameters); + if (result.Assembly != null) + LoadPlugin(result, parameters); - return info; + return result; } /// @@ -97,28 +97,36 @@ namespace Pilz.Plugins /// /// /// - public TPluginRuntimeInfo LoadPlugin(Assembly assembly, params object?[]? parameters) + public PluginLoadInfo LoadPlugin(Assembly assembly, params object?[]? parameters) { - var info = Activator.CreateInstance(); - info.Assembly = assembly; - LoadPlugin(info); - return info; + var result = new PluginLoadInfo + { + Assembly = assembly + }; + + LoadPlugin(result); + + return result; } - private void LoadPlugin(TPluginRuntimeInfo info, params object?[]? parameters) + private void LoadPlugin(PluginLoadInfo result, params object?[]? parameters) { var irmplugin = typeof(TPluginInterface); - if (info.Assembly == null) - info.Status = PluginStatus.NoValidPlugin; - else if (loadedPlugins.Any(n => n.Assembly == info.Assembly)) - info.Status = PluginStatus.AlreadyLoaded; + if (result.Assembly == null) + result.Status = PluginLoadStatus.NoValidPlugin; + else if (loadedPlugins.Any(n => n.Assembly == result.Assembly)) + result.Status = PluginLoadStatus.AlreadyLoaded; else { - foreach (var type in info.Assembly.GetTypes()) + foreach (var type in result.Assembly.GetTypes()) { - if (info.Plugin == null && irmplugin.IsAssignableFrom(type)) + if (irmplugin.IsAssignableFrom(type)) { + var info = Activator.CreateInstance(); + info.Assembly = result.Assembly; + result.PluginsInternal.Add(info); + try { if (Activator.CreateInstance(type, parameters) is TPluginInterface plugin) @@ -136,8 +144,8 @@ namespace Pilz.Plugins } } - if (info.Plugin == null) - info.Status = PluginStatus.NoValidPlugin; + if (result.PluginsInternal.Count == 0) + result.Status = PluginLoadStatus.NoValidPlugin; } } } diff --git a/Pilz.Plugins/PluginStatus.cs b/Pilz.Plugins/PluginStatus.cs index 9dd4098..c490107 100644 --- a/Pilz.Plugins/PluginStatus.cs +++ b/Pilz.Plugins/PluginStatus.cs @@ -10,9 +10,6 @@ namespace Pilz.Plugins { None, Success, - AlreadyLoaded, - FileNotFound, - ErrorAtLoading, ErrorAtInitializing, NoValidPlugin }