public int Run(string[] args) { // create a console window for this application (or assign it to the existing console window) if (!ConsoleUtil.AttachConsole(-1)) { ConsoleUtil.AllocConsole(); } // set up special console logging for headless mode using (var log = new LoggerConfiguration() .MinimumLevel.ControlledBy(LoggingUtil.LoggingLevelSwitch) .WriteTo.Logger(Log.Logger) .WriteTo.Console(outputTemplate: HEADLESS_LOG_FORMAT) .CreateLogger()) { Log.Logger = log; // parse the arguments, and log any errors int exitCode = 0; try { var commandTypes = Commands.Select(c => c.OptionsType).ToArray(); var parseResult = Parser.Default.ParseArguments(args, commandTypes); foreach (var command in Commands) { command.Register(ref parseResult); } } catch (HeadlessException e) { Log.Fatal(e.Message); exitCode = 1; } catch (Exception e) { var errString = $"{e.Message}\n{e.StackTrace}"; Log.Fatal(errString); exitCode = 1; } finally { ConsoleUtil.FreeConsole(); } return(exitCode); } }