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
|
{
|
/// <summary>
|
/// App.xaml 的交互逻辑
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 启动后往注册表写点东西
|
/// </summary>
|
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();
|
}
|
}
|
}
|