using AddInPlugin.Setting; using Microsoft.Win32; using SeqEditor.Util; using System.Diagnostics; using System.IO; using System.Management; using System.Reflection; using System.Windows; namespace OpenTapEditor; public class GlobalConfig { public double GlobalFontSize { get; set; } = 14; } public class GlobalConfigHolder { public static GlobalConfig Config { get; internal set; } } /// /// Interaction logic for App.xaml /// public partial class App : Application { public App() { AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException; ; AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; } private void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e) { //var ex = e.Exception; //MessageBox.Show(ex?.Message, "未知错误"); } private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { var ex = e.ExceptionObject as Exception; // Log.Error($"UnhandledException. {ex}"); MessageBox.Show(ex?.Message, "未知错误"); } private void WriteRegister() { string Company = "JingCe", Program = "SeqEditor"; 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); } } 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 LoadConfig() { this.Resources["GlobalFontSize"] = StationSettings.Current.FontSize; } protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); // 放在最后,确保后续逻辑用到时已在内存 } private static void PreloadAllAssemblies() { var dirs = new System.Collections.Generic.List { AppDomain.CurrentDomain.BaseDirectory }; string privatePath = "3rds;Libs"; if (!string.IsNullOrEmpty(privatePath)) { foreach (var p in privatePath.Split(';')) { string full = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, p.Trim()); if (Directory.Exists(full)) dirs.Add(full); } } foreach (var dir in dirs) { foreach (string dll in Directory.GetFiles(dir, "*.dll")) { try { var ass = Assembly.LoadFrom(dll); // 按名称加载,自动去重 } catch (BadImageFormatException) { /* 本机/C++ DLL,跳过 */ } catch (FileLoadException) { /* 已加载/强命名不匹配,跳过 */ } catch (FileNotFoundException) { /* 依赖缺失,跳过 */ } catch { /* 其余异常跳过 */ } } } } private Mutex mutex; public void Application_Startup(object sender, StartupEventArgs e) { var process = GetProcess(); mutex = new Mutex(true, "OpenTapEditor_OnlyRun_CRNS"); if (mutex.WaitOne(0, false))//&& process == null { WriteRegister(); LoadConfig(); LangUtil.Load(); //LoadingWindow window = new LoadingWindow(); MainWindow window = new MainWindow(); window.Show(); } else { MessageBox.Show("程序已经在运行!", "提示"); this.Shutdown(); } } }