From fe2aa4880d5c9fd88088ad0ed81ebaca05629f5f Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 02 十一月 2026 17:59:45 +0800
Subject: [PATCH] feat: 集成CAN驱动/模拟器 + 仪器仪表注册/硬件调试模块
---
HMI.Base/PluginLoader.cs | 232 ++++++++++++++++++++++++++-------------------------------
1 files changed, 105 insertions(+), 127 deletions(-)
diff --git a/HMI.Base/PluginLoader.cs b/HMI.Base/PluginLoader.cs
index eef52ba..81e1f84 100644
--- a/HMI.Base/PluginLoader.cs
+++ b/HMI.Base/PluginLoader.cs
@@ -4,7 +4,6 @@
using log4net;
using System;
using System.Collections.Generic;
-using System.Data;
using System.IO;
using System.Reflection;
using System.Threading;
@@ -13,25 +12,11 @@
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;
public SqliteHelper sqliteHelper;
public List<PluginInfo> Menus { get; private set; }
public List<PluginInfo> Plugins { get; private set; }
@@ -44,6 +29,15 @@
sqliteHelper = new SqliteHelper(PathHelper.DatabasePath);
}
+ public static void Reset()
+ {
+ if (Instance != null)
+ {
+ Instance = null;
+ }
+ GC.Collect();
+ }
+
public static PluginLoader GetLoader()
{
if (Instance == null)
@@ -53,39 +47,61 @@
return Instance;
}
- public void LoadMenuAndPlugin(Dispatcher dispatcher)
+ private IPluginContainer pluginContainer;
+
+ public void LoadMenuAndPlugin(IPluginContainer container, Dispatcher dispatcher)
{
+ pluginContainer = container;
if (Menus == null)
{
Plugins = new List<PluginInfo>();
Menus = LoadTreeMenu(dispatcher);
- dispatcher.Invoke(() =>
- {
- LoadMessageAppend?.Invoke(this, new LoadMsg { Type = LoadMsgType.FINISHED });
- });
+ sqliteHelper.Close();
+ LoadMessageAppend?.Invoke(this, new LoadMsg { Type = LoadMsgType.FINISHED });
}
+ pluginContainer.DoCloseEvent += PluginContainer_DoCloseEvent;
}
- private void LoadChildrenMenu(PluginInfo menu, Dispatcher dispatcher)
+ private void PluginContainer_DoCloseEvent(object sender, EventArgs e)
{
- LoadMessageAppend?.Invoke(this, new LoadMsg
+ Reset();
+ }
+
+ private void LoadChildrenMenu()
+ {
+ foreach (var menu in Plugins)
{
- Type = LoadMsgType.LOADING,
- Message = $"姝e湪鍔犺浇{menu.Name}鑿滃崟..."
- });
- try
- {
- Application.Current.Dispatcher.Invoke(() =>
+ CountdownEvent c = new CountdownEvent(1);
+ Thread.Sleep(50);
+ Application.Current.Dispatcher.Invoke(new Action(() =>
{
- if (!string.IsNullOrEmpty(menu.DllPath))
+ try
{
- 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)
+ var start = DateTime.Now;
+ log.Info(this.lang("App.IsLoadingMenu", 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);
+ Assembly ass = Assembly.LoadFrom(dllPath);
+ var tss = ass.GetTypes();
+ Type ClassType = ass.GetType(menu.ClassName);
+ object Instance = Activator.CreateInstance(ClassType);
+ menu.Content = Instance;
+ if (Instance is IPlugin plugin)
+ {
+ }
+ else
+ {
+ plugin = new PluginPackage(Instance);
+ }
plugin.SetLogger(LogManager.GetLogger(menu.Code));
string configFolder = Path.Combine(PathHelper.ConfigFolder, menu.Code);
if (!Directory.Exists(configFolder))
@@ -94,76 +110,20 @@
}
plugin.SetBaseFolder(configFolder);
plugin.InitFinish();
- }
- Type SettingType = ass.GetType($"{menu.ClassName}_Setting");
- if (SettingType != null)
- {
- object SettingInstance = Activator.CreateInstance(SettingType);
- menu.SettingControl = SettingInstance;
- }
- }
- });
- Thread.Sleep(100);
- }
- catch (Exception ex)
- {
- LoadMessageAppend?.Invoke(this,
- new LoadMsg
- {
- Type = LoadMsgType.LOADING,
- Result = false,
- Message = $"{ex.Message} {ex.StackTrace}"
- });
- }
- }
-
- private void LoadChildrenMenu()
- {
- foreach (var menu in Plugins)
- {
- CountdownEvent c = new CountdownEvent(1);
- Thread.Sleep(100);
- Application.Current.Dispatcher.Invoke(new Action(() =>
- {
-
- try
- {
- LoadMessageAppend?.Invoke(this,
- new LoadMsg
+ pluginContainer.OnCloseEvent += plugin.OnClose;
+ pluginContainer.DoCloseEvent += plugin.DoClose;
+ Type SettingType = ass.GetType($"{menu.ClassName}_Setting");
+ if (SettingType != null)
{
- Type = LoadMsgType.LOADING,
- Message = this.lang("App.IsLoadingMenu", 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))
+ object SettingInstance = Activator.CreateInstance(SettingType);
+ if (SettingInstance is IFolderOwner fo)
{
- Directory.CreateDirectory(configFolder);
+ fo.SetBaseFolder(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;
- }
+ menu.SettingControl = SettingInstance;
}
}
+ log.Info($"{this.lang("App.MenuLoadSuccess", menu.Name)} Cost: {(DateTime.Now - start).TotalMilliseconds}ms");
LoadMessageAppend?.Invoke(this,
new LoadMsg
{
@@ -174,7 +134,7 @@
}
catch (Exception ex)
{
- log.Error("Load Plugin Failed.", ex);
+ log.Error($"Load Plugin [{menu.Name}] Failed.", ex);
LoadMessageAppend?.Invoke(this, new LoadMsg
{
Type = LoadMsgType.LOADING,
@@ -191,49 +151,68 @@
}
}
+ private PluginInfo ConvertPermission2PluginInfo(PermissionData data)
+ {
+ if (data.Type == "鏉冮檺") return null;
+ PluginInfo info = new PluginInfo
+ {
+ Code = data.Code,
+ Name = data.Name,
+ Type = data.Type,
+ ParentCode = data.ParentCode,
+ DllPath = data.DllPath,
+ ClassName = data.ClassName,
+ IconFont = data.IconFont
+ //Icon = new BitmapImage(new Uri(Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString())))
+ };
+ if (data.Children != null && data.Children.Count > 0)
+ {
+ foreach (var child in data.Children)
+ {
+ var childInfo = ConvertPermission2PluginInfo(child);
+ if (childInfo != null) info.Children.Add(childInfo);
+ }
+ }
+ return info;
+ }
+
public List<PluginInfo> LoadTreeMenu(Dispatcher dispatcher)
{
- //LoadMessageAppend?.Invoke(this, "寮�濮嬪姞杞借彍鍗�...");
- List<PluginInfo> data = new List<PluginInfo>();
+ List<PluginInfo> menus = new List<PluginInfo>();
Dictionary<string, PluginInfo> cache = new Dictionary<string, PluginInfo>();
try
{
- 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)
+ List<PermissionData> allPermissions = UserInfo.User?.AllPermissions;
+ if (allPermissions != null)
{
- Application.Current.Dispatcher.Invoke(() =>
+ Application.Current.Dispatcher.Invoke(new Action(() =>
{
+ log.Info(this.lang("App.MenuCount", allPermissions.Count));
LoadMessageAppend?.Invoke(this,
new LoadMsg
{
Type = LoadMsgType.INIT,
- NumData = dt.Rows.Count,
- Message = this.lang("App.MenuCount", dt.Rows.Count),
+ NumData = allPermissions.Count,
+ Message = this.lang("App.MenuCount", allPermissions.Count),
});
- foreach (DataRow dr in dt.Rows)
+ foreach (PermissionData data in allPermissions)
{
- string path = Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString());
+ if (data.Type == "Permission") continue;
var menu = new PluginInfo
{
- Code = dr["code"].ToString(),
- Name = dr["name"].ToString(),
- ParentCode = dr["parentCode"].ToString(),
- DllPath = dr["dllPath"].ToString(),
- ClassName = dr["className"].ToString(),
- IconFont = dr["icon"].ToString()
- //Icon = new BitmapImage(new Uri(Path.Combine(PathHelper.IconFolder, dr["iconPath"].ToString())))
+ Code = data.Code,
+ Name = data.Name,
+ Type = data.Type,
+ ParentCode = data.ParentCode,
+ DllPath = data.DllPath,
+ ClassName = data.ClassName,
+ IconFont = data.IconFont
};
cache[menu.Code] = menu;
if (!cache.ContainsKey(menu.ParentCode))
{
- data.Add(menu);
+ menus.Add(menu);
}
else
{
@@ -241,7 +220,7 @@
}
Plugins.Add(menu);
}
- });
+ }));
LoadChildrenMenu();
}
}
@@ -249,8 +228,7 @@
{
//LoadMessageAppend?.Invoke(this, ex.Message);
}
- return data;
+ return menus;
}
-
}
}
--
Gitblit v1.9.1