using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Data.Core; using Avalonia.Data.Core.Plugins; using Avalonia.Markup.Xaml; using Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.ViewModels; using Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Views; using Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Services; using Serilog; using System; using System.Linq; using System.Threading.Tasks; namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance { public partial class App : Application { private static bool exceptionHandlersRegistered; private readonly MachineLicenseService licenseService = new(); public override void Initialize() { AvaloniaXamlLoader.Load(this); } public override void OnFrameworkInitializationCompleted() { RegisterExceptionHandlers(); if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { var check = licenseService.Check(updateHeartbeat: true); if (check.CanUseSoftware) { ShowMainWindow(desktop, showImmediately: false); } else { var mode = check.State switch { Models.LicenseCheckState.NotInitialized => LicenseWindowMode.Initialization, Models.LicenseCheckState.Expired => LicenseWindowMode.Unlock, _ => LicenseWindowMode.Blocked }; var licenseWindow = new LicenseWindow(licenseService, mode, check.Message); desktop.MainWindow = licenseWindow; licenseWindow.Closed += (_, _) => { if (licenseWindow.Succeeded) { ShowMainWindow(desktop, showImmediately: true); } else { desktop.Shutdown(); } }; } } base.OnFrameworkInitializationCompleted(); } private void ShowMainWindow(IClassicDesktopStyleApplicationLifetime desktop, bool showImmediately) { var viewModel = new MainWindowViewModel(licenseService); desktop.MainWindow = new MainWindow(licenseService) { DataContext = viewModel, }; if (showImmediately) { desktop.MainWindow.Show(); } } private static void RegisterExceptionHandlers() { if (exceptionHandlersRegistered) { return; } AppDomain.CurrentDomain.UnhandledException += (_, args) => { if (args.ExceptionObject is Exception exception) { Log.Fatal(exception, "捕获到 AppDomain 未处理异常,IsTerminating={IsTerminating}", args.IsTerminating); } else { Log.Fatal("捕获到 AppDomain 未处理异常:{ExceptionObject}", args.ExceptionObject); } }; TaskScheduler.UnobservedTaskException += (_, args) => { Log.Error(args.Exception, "捕获到未观察的后台任务异常"); args.SetObserved(); }; exceptionHandlersRegistered = true; } } }