using System.Runtime.Loader; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Proxd_man.Config; using Proxd_man.Monitor; 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.SetMinimumLevel(LogLevel.Debug); }) .Configure(configuration.GetSection("Proxd")) .AddSingleton() .AddSingleton() .AddSingleton() .BuildServiceProvider(); var logger = serviceProvider.GetRequiredService>(); var xrayCoreManager = serviceProvider.GetRequiredService(); await xrayCoreManager.InitialXrayCoreProgram(); var subscribeManager = serviceProvider.GetRequiredService(); await subscribeManager.CheckAndUpdateSubscribes(); var outboundMonitor = serviceProvider.GetRequiredService(); if (subscribeManager.GetSubscribeOutbounds().Count > 0) { logger.LogInformation("已通过订阅获取到出站代理, 正在尝试选取最优出站代理..."); _ = outboundMonitor.ReselectOutbound(subscribeManager.GetSubscribeOutbounds()); } else { logger.LogWarning("没有获取到任何出站代理, 等待下一次订阅更新..."); } 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!"); } }