alielie
2025-03-13 ba6207f52db76ab47cd6534de0cf1712674ff179
HMI.Base/PluginLoader.cs
@@ -8,15 +8,27 @@
using System.IO;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
namespace HMI.Base
{
    public enum LoadMsgType
    {
        INIT, LOADING, FINISHED
    }
    public class LoadMsg
    {
        public string Message { get; set; }
        public bool? Result { get; set; }
        public LoadMsgType Type { get; set; }
        public int NumData { get; set; }
    }
    public class PluginLoader
    {
        private static ILog log = LogManager.GetLogger("PluginLoader");
        private static string PluginFolder = PathHelper.PluginFolder();
        public bool Completed { get; private set; } = false;
@@ -25,8 +37,7 @@
        public List<PluginInfo> Plugins { get; private set; }
        public static PluginLoader Instance { get; private set; }
        public event EventHandler<string> LoadMessageAppend;
        public event EventHandler Loaded;
        public event EventHandler<LoadMsg> LoadMessageAppend;
        private PluginLoader()
        {
@@ -48,13 +59,20 @@
            {
                Plugins = new List<PluginInfo>();
                Menus = LoadTreeMenu(dispatcher);
                Loaded?.Invoke(this, null);
                dispatcher.Invoke(() =>
                {
                    LoadMessageAppend?.Invoke(this, new LoadMsg { Type = LoadMsgType.FINISHED });
                });
            }
        }
        private void LoadChildrenMenu(PluginInfo menu, Dispatcher dispatcher)
        {
            LoadMessageAppend?.Invoke(this, $"正在加载{menu.Name}菜单...");
            LoadMessageAppend?.Invoke(this, new LoadMsg
            {
                Type = LoadMsgType.LOADING,
                Message = $"正在加载{menu.Name}菜单..."
            });
            try
            {
                Application.Current.Dispatcher.Invoke(() =>
@@ -89,7 +107,13 @@
            }
            catch (Exception ex)
            {
                LoadMessageAppend?.Invoke(this, $"{ex.Message} {ex.StackTrace}");
                LoadMessageAppend?.Invoke(this,
                     new LoadMsg
                     {
                         Type = LoadMsgType.LOADING,
                         Result = false,
                         Message = $"{ex.Message} {ex.StackTrace}"
                     });
            }
        }
@@ -98,13 +122,19 @@
            foreach (var menu in Plugins)
            {
                CountdownEvent c = new CountdownEvent(1);
                Thread.Sleep(10);
                Thread.Sleep(100);
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    try
                    {
                        LoadMessageAppend?.Invoke(this, $"正在加载{menu.Name}菜单...");
                        LoadMessageAppend?.Invoke(this,
                            new LoadMsg
                            {
                                Type = LoadMsgType.LOADING,
                                Message = this.lang("App.IsLoadingMenu", menu.Name)
                            }
                        );
                        if (!string.IsNullOrEmpty(menu.DllPath))
                        {
                            string dllPath = Path.Combine(PluginFolder, menu.DllPath);
@@ -134,11 +164,23 @@
                                }
                            }
                        }
                        LoadMessageAppend?.Invoke(this, $"加载完");
                        LoadMessageAppend?.Invoke(this,
                            new LoadMsg
                            {
                                Type = LoadMsgType.LOADING,
                                Result = true,
                                Message = this.lang("App.MenuLoadSuccess", menu.Name),
                            });
                    }
                    catch (Exception ex)
                    {
                        LoadMessageAppend?.Invoke(this, $"{ex.Message} {ex.StackTrace}");
                        log.Error("Load Plugin Failed.", ex);
                        LoadMessageAppend?.Invoke(this, new LoadMsg
                        {
                            Type = LoadMsgType.LOADING,
                            Result = false,
                            Message = this.lang("App.MenuLoadFailed", menu.Name, ex.Message, ex.StackTrace)
                        });
                    }
                    finally
                    {
@@ -165,9 +207,16 @@
                DataTable dt = sqliteHelper.GetDataTable(sql);
                if (dt != null)
                {
                    //LoadMessageAppend?.Invoke(this, $"共有{dt.Rows.Count}条菜单待加载...");
                    Application.Current.Dispatcher.Invoke(() =>
                    {
                        LoadMessageAppend?.Invoke(this,
                          new LoadMsg
                          {
                              Type = LoadMsgType.INIT,
                              NumData = dt.Rows.Count,
                              Message = this.lang("App.MenuCount", dt.Rows.Count),
                          });
                        foreach (DataRow dr in dt.Rows)
                        {
                            string path = Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString());