alielie
2025-03-11 2e54b439c64e0adbb7e010243c1f33aa5fc5f503
HMI.Base/PluginLoader.cs
@@ -1,13 +1,17 @@
using System;
using HMI.Core.Api;
using HMI.Core.Entity;
using HMI.Core.Util;
using log4net;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
using HMI.Core.Api;
using HMI.Core.Util;
using log4net;
using System.Windows.Threading;
namespace HMI.Base
{
@@ -17,12 +21,12 @@
        public bool Completed { get; private set; } = false;
        public SqliteHelper sqliteHelper;
        public ObservableCollection<PluginInfo> Menus { get; private set; }
        public ObservableCollection<PluginInfo> Plugins { get; private set; }
        public List<PluginInfo> Menus { get; private set; }
        public List<PluginInfo> Plugins { get; private set; }
        public static PluginLoader Instance { get; private set; }
        public event EventHandler<string> LoadMessageAppend;
        public event EventHandler Loaded;
        private PluginLoader()
        {
@@ -38,19 +42,22 @@
            return Instance;
        }
        public void LoadMenuAndPlugin()
        public void LoadMenuAndPlugin(Dispatcher dispatcher)
        {
            if (Menus == null)
            {
                Plugins = new ObservableCollection<PluginInfo>();
                Menus = LoadTreeMenu();
                Plugins = new List<PluginInfo>();
                Menus = LoadTreeMenu(dispatcher);
                Loaded?.Invoke(this, null);
            }
        }
        private void LoadChildrenMenu(PluginInfo menu)
        private void LoadChildrenMenu(PluginInfo menu, Dispatcher dispatcher)
        {
            LoadMessageAppend?.Invoke(this, $"正在加载{menu.Name}菜单...");
            try
            {
                Application.Current.Dispatcher.Invoke(() =>
            {
                if (!string.IsNullOrEmpty(menu.DllPath))
                {
@@ -77,6 +84,8 @@
                        menu.SettingControl = SettingInstance;
                    }
                }
                });
                Thread.Sleep(100);
            }
            catch (Exception ex)
            {
@@ -84,17 +93,81 @@
            }
        }
        public ObservableCollection<PluginInfo> LoadTreeMenu()
        private void LoadChildrenMenu()
        {
            ObservableCollection<PluginInfo> data = new ObservableCollection<PluginInfo>();
            foreach (var menu in Plugins)
            {
                CountdownEvent c = new CountdownEvent(1);
                Thread.Sleep(10);
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    try
                    {
                        LoadMessageAppend?.Invoke(this, $"正在加载{menu.Name}菜单...");
                        if (!string.IsNullOrEmpty(menu.DllPath))
                        {
                            string dllPath = Path.Combine(PluginFolder, menu.DllPath);
                            Assembly ass = Assembly.LoadFrom(dllPath);
                            Type ClassType = ass.GetType(menu.ClassName);
                            object Instance = Activator.CreateInstance(ClassType);
                            menu.Content = Instance;
                            if (Instance is IPlugin plugin)
                            {
                                plugin.SetLogger(LogManager.GetLogger(menu.Code));
                                string configFolder = Path.Combine(PathHelper.ConfigFolder, menu.Code);
                                if (!Directory.Exists(configFolder))
                                {
                                    Directory.CreateDirectory(configFolder);
                                }
                                plugin.SetBaseFolder(configFolder);
                                plugin.InitFinish();
                                Type SettingType = ass.GetType($"{menu.ClassName}_Setting");
                                if (SettingType != null)
                                {
                                    object SettingInstance = Activator.CreateInstance(SettingType);
                                    if (SettingInstance is IFolderOwner fo)
                                    {
                                        fo.SetBaseFolder(configFolder);
                                    }
                                    menu.SettingControl = SettingInstance;
                                }
                            }
                        }
                        LoadMessageAppend?.Invoke(this, $"加载完");
                    }
                    catch (Exception ex)
                    {
                        LoadMessageAppend?.Invoke(this, $"{ex.Message} {ex.StackTrace}");
                    }
                    finally
                    {
                        c.Signal();
                    }
                }));
                c.Wait();
            }
        }
        public List<PluginInfo> LoadTreeMenu(Dispatcher dispatcher)
        {
            //LoadMessageAppend?.Invoke(this, "开始加载菜单...");
            List<PluginInfo> data = new List<PluginInfo>();
            Dictionary<string, PluginInfo> cache = new Dictionary<string, PluginInfo>();
            try
            {
                LoadMessageAppend?.Invoke(this, "开始加载菜单...");
                DataTable dt = sqliteHelper.GetDataTable(@"SELECT * FROM menu ORDER BY level,id;");
                UserInfo user = UserInfo.User;
                string sql = $@"SELECT m.* FROM menu AS m INNER JOIN role_menu_rel AS rrel ON m.code = rrel.menuCode
INNER JOIN role AS r ON rrel.roleCode = r.code
INNER JOIN user_role_rel AS urel ON r.code = urel.roleCode
AND urel.username = '{user.Username}' ORDER BY m.level, m.id;";
                DataTable dt = sqliteHelper.GetDataTable(sql);
                if (dt != null)
                {
                    LoadMessageAppend?.Invoke(this, $"共有{dt.Rows.Count}条菜单待加载...");
                    //LoadMessageAppend?.Invoke(this, $"共有{dt.Rows.Count}条菜单待加载...");
                    Application.Current.Dispatcher.Invoke(() =>
                    {
                    foreach (DataRow dr in dt.Rows)
                    {
                        string path = Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString());
@@ -105,7 +178,8 @@
                            ParentCode = dr["parentCode"].ToString(),
                            DllPath = dr["dllPath"].ToString(),
                            ClassName = dr["className"].ToString(),
                            Icon = new BitmapImage(new Uri(Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString())))
                                IconFont = dr["icon"].ToString()
                                //Icon = new BitmapImage(new Uri(Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString())))
                        };
                        cache[menu.Code] = menu;
                        if (!cache.ContainsKey(menu.ParentCode))
@@ -117,13 +191,14 @@
                            cache[menu.ParentCode].Children.Add(menu);
                        }
                        Plugins.Add(menu);
                        LoadChildrenMenu(menu);
                    }
                    });
                    LoadChildrenMenu();
                }
            }
            catch (Exception ex)
            {
                LoadMessageAppend?.Invoke(this, ex.Message);
                //LoadMessageAppend?.Invoke(this, ex.Message);
            }
            return data;
        }