From 77cf91e8024d2e487d15d4d5c33b2bd9bd950981 Mon Sep 17 00:00:00 2001 From: PrefacedCorg <1876568293@qq.com> Date: Wed, 8 Apr 2026 12:43:55 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20"=E6=9B=B4=E6=96=B0=20PluginManager.cs?= =?UTF-8?q?"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit ea55eb1738f6d43fd8f3159ad0ece8e7e02babd7. --- Ink Canvas/Plugins/PluginManager.cs | 81 +++++++++++++++++------------ 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/Ink Canvas/Plugins/PluginManager.cs b/Ink Canvas/Plugins/PluginManager.cs index 8956148f..0f042bae 100644 --- a/Ink Canvas/Plugins/PluginManager.cs +++ b/Ink Canvas/Plugins/PluginManager.cs @@ -2,10 +2,8 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; using System.Threading.Tasks; -using Weikio.PluginFramework; -using Weikio.PluginFramework.Abstractions; -using Weikio.PluginFramework.Catalogs; namespace Ink_Canvas.Plugins { @@ -17,6 +15,7 @@ namespace Ink_Canvas.Plugins public string FilePath { get; set; } = ""; public bool IsLoaded { get; set; } public IPlugin? Instance { get; set; } + public Assembly? Assembly { get; set; } public Exception? LoadError { get; set; } } @@ -28,7 +27,6 @@ namespace Ink_Canvas.Plugins private readonly List _plugins = new(); private readonly Dictionary _services = new(); private string _pluginsDirectory; - private FolderPluginCatalog? _catalog; public IReadOnlyList Plugins => _plugins.AsReadOnly(); public event EventHandler? PluginLoaded; @@ -50,6 +48,11 @@ namespace Ink_Canvas.Plugins } public async Task LoadAllAsync() + { + await Task.Run(() => LoadAll()); + } + + private void LoadAll() { if (!Directory.Exists(_pluginsDirectory)) { @@ -58,58 +61,70 @@ namespace Ink_Canvas.Plugins return; } + var dllFiles = Directory.GetFiles(_pluginsDirectory, "*.dll") + .Where(f => !f.EndsWith("InkCanvasForClass.dll") && + !f.EndsWith("Weikio.PluginFramework.dll")); + + foreach (var dll in dllFiles) + { + LoadPlugin(dll); + } + + Log($"Plugin loading complete. Loaded {_plugins.Count} plugins."); + } + + private void LoadPlugin(string dllPath) + { + if (!File.Exists(dllPath)) + { + Log($"Plugin file not found: {dllPath}"); + return; + } + try { - var options = new FolderPluginCatalogOptions - { - SearchPatterns = new[] { "*.dll" }, - IncludeSubfolders = false - }; + var assembly = Assembly.LoadFrom(dllPath); + var pluginTypes = assembly.GetTypes() + .Where(t => typeof(IPlugin).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract); - _catalog = new FolderPluginCatalog(_pluginsDirectory, options); - await _catalog.Initialize(); - - var weikioPlugins = _catalog.GetPlugins(); - - foreach (var weikioPlugin in weikioPlugins) + foreach (var pluginType in pluginTypes) { try { - var pluginType = weikioPlugin.GetType(); - var instance = Activator.CreateInstance(pluginType) as IPlugin; - - if (instance == null) - { - Log($"Failed to create instance of plugin from {weikioPlugin.AssemblyPath}"); - continue; - } + var plugin = (IPlugin)Activator.CreateInstance(pluginType)!; var info = new PluginInfo { - Id = instance.Id, - Name = instance.Name, - Version = instance.Version, - FilePath = weikioPlugin.AssemblyPath ?? "", + Id = plugin.Id, + Name = plugin.Name, + Version = plugin.Version, + FilePath = dllPath, IsLoaded = true, - Instance = instance + Instance = plugin, + Assembly = assembly }; - instance.Initialize(this); + plugin.Initialize(this); _plugins.Add(info); PluginLoaded?.Invoke(this, info); Log($"Plugin loaded: {info.Name} v{info.Version}"); } catch (Exception ex) { - LogError($"Failed to load plugin from {weikioPlugin.AssemblyPath}", ex); + LogError($"Failed to create plugin instance from {dllPath}", ex); } } - - Log($"Plugin loading complete. Loaded {_plugins.Count} plugins."); } catch (Exception ex) { - LogError("Failed to initialize plugin catalog", ex); + LogError($"Failed to load plugin from {dllPath}", ex); + + var info = new PluginInfo + { + FilePath = dllPath, + LoadError = ex + }; + _plugins.Add(info); } }