using System.IO; using System.Windows; using Microsoft.Extensions.DependencyInjection; using PersonalToolBox.Services; using PersonalToolBox.Views; namespace PersonalToolBox; /// /// WPF 应用程序入口,负责依赖注入容器初始化和启动主窗口 /// public partial class App : Application { public static IServiceProvider Services { get; private set; } = null!; private static readonly string CrashLogPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PersonalToolBox", "crash.log"); public App() { // 监听未处理的异常,写入文件日志 DispatcherUnhandledException += (s, e) => { WriteCrashLog($"UI线程异常: {e.Exception}"); e.Handled = true; MessageBox.Show($"发生未处理异常:\n{e.Exception.Message}\n\n详情已写入:\n{CrashLogPath}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); }; AppDomain.CurrentDomain.UnhandledException += (s, e) => { WriteCrashLog($"未处理异常: {e.ExceptionObject}"); }; } protected override void OnStartup(StartupEventArgs e) { try { base.OnStartup(e); var services = new ServiceCollection(); ConfigureServices(services); Services = services.BuildServiceProvider(); // 启动时加载配置文件(含路径验证与容错) var dataService = Services.GetRequiredService(); dataService.Load(); var mainWindow = Services.GetRequiredService(); mainWindow.Show(); } catch (Exception ex) { WriteCrashLog($"启动失败: {ex}"); MessageBox.Show($"启动失败:\n{ex.Message}\n\n详情已写入:\n{CrashLogPath}", "启动错误", MessageBoxButton.OK, MessageBoxImage.Error); Shutdown(); } } /// /// 注册所有服务到 DI 容器 /// private static void ConfigureServices(IServiceCollection services) { services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddTransient(); services.AddSingleton(); } /// /// 将崩溃信息写入文件日志 /// public static void WriteCrashLog(string message) { try { var dir = Path.GetDirectoryName(CrashLogPath); if (dir != null) Directory.CreateDirectory(dir); File.AppendAllText(CrashLogPath, $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] {message}{Environment.NewLine}{Environment.NewLine}"); } catch { // 无法写入日志时静默忽略 } } }