using System.Runtime.Loader; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Proxd_man.Config; using Proxd_man.Subscribe; namespace Proxd_man; internal class Program { public static async Task Main(string[] args) { Console.WriteLine($"Base Directory: {AppContext.BaseDirectory}"); var configurationBuilder = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: false) .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables() .AddCommandLine(args); var configuration = configurationBuilder.Build(); var serviceProvider = new ServiceCollection() .AddLogging(configure => { configure.AddConfiguration(configuration); configure.AddConsole(); }) .Configure(configuration.GetSection("Proxd")) .AddSingleton() .AddSingleton() .BuildServiceProvider(); var logger = serviceProvider.GetRequiredService>(); var xrayCoreManager = serviceProvider.GetRequiredService(); await xrayCoreManager.InitialXrayCoreProgram(); var subscribeManager = serviceProvider.GetRequiredService(); subscribeManager.StartUpdateSubscribes(); // 监听 SIGTERM 和 SIGINT 信号, 以优雅退出 var cts = new CancellationTokenSource(); AppDomain.CurrentDomain.ProcessExit += (_, _) => cts.Cancel(); Console.CancelKeyPress += (_, _) => cts.Cancel(); AssemblyLoadContext.Default.Unloading += _ => cts.Cancel(); try { await Task.Delay(-1, cts.Token); } catch (TaskCanceledException) { logger.LogInformation("正在退出..."); } logger.LogInformation("Good Bye!"); } }