using HMI.Core.Setting; using HMI.Core.Util; using HMI.UI.Util; using log4net; using Microsoft.Win32; using Panuon.WPF.UI; using System; using System.Diagnostics; using System.IO; using System.Management; using System.Reflection; using System.Threading; using System.Windows; using WPFProject.Utils; namespace WPFProject { /// /// App.xaml 的交互逻辑 /// public partial class App : Application { private ILog log; private LogCleanner logCleanner; public App() { log = LogManager.GetLogger("APP"); AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; } private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { var ex = e.ExceptionObject as Exception; log.Error("UnhandledException.", ex); MsgBoxHelper.ErrorMessage(Current.MainWindow, this.lang("App.AppUnhandledException", ex.Message), this.lang("App.Error"), MessageBoxButton.OK, MessageBoxIcon.Error, DefaultButton.YesOK, 5); } public static Process GetProcess() { Process cur = Process.GetCurrentProcess(); string exePath = Assembly.GetExecutingAssembly().Location; string query = $"SELECT ProcessId FROM Win32_Process WHERE ExecutablePath = '{exePath.Replace("\\", "\\\\")}'"; using (var searcher = new ManagementObjectSearcher(query)) { foreach (var obj in searcher.Get()) { int processId = Convert.ToInt32(obj["ProcessId"]); if (processId != cur.Id) { return Process.GetProcessById(processId); } } } return null; } /// /// 启动后往注册表写点东西 /// private void WriteRegister() { string Company = "JingCe", Program = "HMI"; try { string registryPath = @$"SOFTWARE\{Company}\{Program}"; using RegistryKey key = Registry.CurrentUser.CreateSubKey(registryPath, true) ?? throw new Exception("无法创建或打开注册表键"); string path = AppDomain.CurrentDomain.BaseDirectory; key.SetValue("Location", path, RegistryValueKind.String); } catch (Exception ex) { log.Error("Write Register Failed.", ex); } } private void DoUpdateAction() { using (SqliteHelper helper = new SqliteHelper(PathHelper.DatabasePath)) { if (!helper.HasData("SELECT 1 FROM pragma_table_info('user') WHERE name = 'code';")) { helper.ExecuteSql("ALTER TABLE user ADD code TEXT;"); } } } private static Mutex mutex; private void Application_Startup(object sender, StartupEventArgs e) { var process = GetProcess(); mutex = new Mutex(true, "TestPlatform_OnlyRun_CRNS"); if (mutex.WaitOne(0, false))//&& process == null { WriteRegister(); try { DoUpdateAction(); } catch (Exception ex) { log.Error("Update Failed.", ex); } logCleanner = new LogCleanner(); AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; LoggerHelper.Register(new CommonLogger()); LangUtil.Load(); SystemSetting.SystemSettingChanged += SystemSetting_SystemSettingChanged; ToastHelper.Register(new MainToastHandler()); //LoadingWindow window = new LoadingWindow(); Login window = new Login(); window.Show(); } else { MessageBox.Show("程序已经在运行!", "提示"); this.Shutdown(); } } private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { // 获取请求加载的程序集名称 string assemblyName = new AssemblyName(args.Name).Name; string[] dirs = new string[] { "3rds", "Libs" }; foreach (string dir in dirs) { string dllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, dir, $"{assemblyName}.dll"); if (File.Exists(dllPath)) { // 如果依赖 DLL 存在,则加载并返回它 return Assembly.LoadFrom(dllPath); } } // 否则返回 null return null; } private void SystemSetting_SystemSettingChanged(object sender, SystemSetting e) { LangUtil.LoadLang(); } } }