Si ejecuto mi Program.exe desde una ventana de línea de comando existente, cuando finaliza y sale, la salida de la consola todavía está allí y se puede ver.
Si solo hago doble clic en mi Program.exe , se abrirá una nueva ventana de línea de comando, para la salida de la consola... pero cuando mi exe finalice, esa ventana se cerrará y se llevará las salidas.
En el último caso, para evitar la pérdida de registros de salida, es posible que desee que las últimas 2 líneas de mi Main() sean Console.WriteLine("Press any key to exit"); Console.ReadKey();
Pero si hago eso en el primer caso, entonces es levemente molesto.
¿Hay alguna forma de detectar la diferencia entre esos 2 escenarios, de modo que pueda hacer eso de "esperar a que el usuario diga que puedo cerrar" condicionalmente ... solo si es necesario?
Si desea verificar si su aplicación se inicia desde la línea de comando en .NET, puede usar Console.GetCursorPosition() . La razón por la que esto funciona es que cuando lo inicias desde la línea de comando, el cursor se aleja del punto inicial ( (0, 0) ) porque escribiste algo en la terminal (el nombre de la aplicación). Puedes hacer esto con una comprobación de igualdad:
// .NET 6 class Program { public static void Main(string[] args) { if (Console.GetCursorPosition() == (0, 0)) { //something GUI } else { //something not GUI } } } Nota: debe establecer el tipo de salida en Aplicación de consola, ya que otros tipos de salida harán que Console.GetCursorPosition() genere una excepción.
Para los casos de ejecutar una aplicación de consola desde una línea de comandos y ejecutarla desde Visual Studio, Process.GetCurrentProcess().MainWindowTitle está vacío. En estos casos, NO necesita Console.ReadLine() adicional.
Cuando lo ejecuta haciendo doble clic en el Explorador de Windows, el título de la ventana es la ruta del exe. En este caso, SÍ necesita la Console.ReadLine() adicional.
Entonces, un enfoque algo complicado (¡que solo probé para los tres casos anteriores!) podría ser agregar esto al final de Main() :
if (!string.IsNullOrEmpty(Process.GetCurrentProcess().MainWindowTitle)) Console.ReadLine();No usaría esto en el código de producción, pero podría ser útil como un truco rápido para las utilidades de prueba, etc.