using Avalonia; using Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance.Services; using Serilog; using System; using System.IO; using System.Threading; namespace Footwear_Test_methodsfor_wholeshoe_Slipresistanceperformance { internal sealed class Program { private const string SingleInstanceMutexName = @"Global\FootwearSlipResistancePerformance"; [STAThread] public static int Main(string[] args) { ConfigureLogging(); try { if (args.Length == 2 && string.Equals(args[0], MachineLicenseService.InstallArgument, StringComparison.Ordinal)) { return MachineLicenseService.RunElevatedInstall(args[1]); } using var singleInstanceMutex = new Mutex( initiallyOwned: true, SingleInstanceMutexName, out var isFirstInstance); if (!isFirstInstance) { Log.Warning("检测到鞋类整鞋防滑性能试验程序已在运行,本次启动已取消"); return 0; } Log.Information("鞋类整鞋防滑性能试验程序启动"); BuildAvaloniaApp().StartWithClassicDesktopLifetime(args); return 0; } catch (Exception ex) { Log.Fatal(ex, "程序发生致命异常并退出"); return 1; } finally { Log.Information("鞋类整鞋防滑性能试验程序退出"); Log.CloseAndFlush(); } } public static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure() .UsePlatformDetect() #if DEBUG .WithDeveloperTools() #endif .WithInterFont() .LogToTrace(); private static void ConfigureLogging() { var logDirectory = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "FootwearSlipResistance", "Logs"); Directory.CreateDirectory(logDirectory); Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.File( Path.Combine(logDirectory, "app-.log"), rollingInterval: RollingInterval.Day, retainedFileCountLimit: 30, fileSizeLimitBytes: 20 * 1024 * 1024, rollOnFileSizeLimit: true, shared: true, flushToDiskInterval: TimeSpan.FromSeconds(1), outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}") .CreateLogger(); } } }