namespace GSS2; public partial class Program { // Аргументы командной строки private static List _args = new List(); public static string[] Args => _args.ToArray(); /// /// Точка входа /// [STAThread] public static int Main(string[] args) { _args = args.ToList(); #if DEBUG WaitDebuggerIfNeeded(); #endif // Создаём обработчик аргументов командной строки var rootCommand = Commands.UI.GetCommand(); Commands.CameraTuning.RegisterCommand(rootCommand); Commands.Capture.RegisterCommand(rootCommand); // Обрабатываем аргументы var parseResult = rootCommand?.Parse(_args); // Обрабатываем ошибки if (parseResult is null) { Console.Error.WriteLine("Неизвестная ошибка при обработке аргументов командной строки."); Environment.Exit(1); } if (parseResult.Errors.Count() != 0) { Console.Error.WriteLine( (parseResult.Errors.Count() == 1 ? "Ошибка" : "Ошибки") + " при обработке аргументов командной строки:" ); foreach (var parseError in parseResult.Errors) Console.Error.WriteLine(parseError.Message); Environment.Exit(1); } // Исполняем команду Console.WriteLine("Нажмите Ctrl+C для выхода."); try { return parseResult.Invoke(); } catch (Exception ex) { Console.Error.WriteLine("Ошибка при выполнении программы:"); Console.Error.WriteLine(ex.Message); if (ex.InnerException is not null) Console.Error.WriteLine($"Внутреннее исключение: {ex.InnerException}"); Console.Error.WriteLine(ex.StackTrace); Environment.Exit(1); return 1; } } /// /// Если в присутствует аргумент --debug, /// то удаляет --debug из , выводит информацию о процессе в консоль и ожидает подключения отладчика /// private static void WaitDebuggerIfNeeded() { if (System.Diagnostics.Debugger.IsAttached) return; if (!_args.Contains("--debug")) return; _args.Remove("--debug"); bool keepWaiting = true; void CancelWait(object? _, ConsoleCancelEventArgs ea) { ea.Cancel = true; keepWaiting = false; Console.WriteLine("\nОперация отменена пользователем."); Environment.Exit(0); } Console.CancelKeyPress += CancelWait; Console.WriteLine("Ожидание подключения отладчика."); Console.WriteLine($"Имя процесса: {Environment.ProcessPath}"); Console.WriteLine($"Id процесса: {Environment.ProcessId}"); Console.WriteLine($"Id потока: {Environment.CurrentManagedThreadId}"); Console.WriteLine("Нажмите Ctrl+C для выхода."); while (!System.Diagnostics.Debugger.IsAttached && keepWaiting) Thread.Sleep(100); if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); Console.CancelKeyPress -= CancelWait; } }