2009-07-09 20 views
9

Cuando desarrollo una aplicación de consola C# (que se ejecutará en un servidor) y la ejecuto usando Visual Studio, aparece el mensaje "Presione cualquier tecla para continuar" antes de que el programa finalice.¿Cómo compila VS las aplicaciones de la consola para mostrar "Presione cualquier tecla para continuar"?

Sin embargo, cuando compilo el mismo archivo de código C# de forma manual utilizando CSC, mi programa no muestra ese mensaje y se termina inmediatamente después de terminar su lógica.

¿Alguien sabe cómo puedo hacer la misma función al compilar el código sin usar VS y sin cambiar el código C# cualquier adición de un ReadLine()?

ACTUALIZACIÓN: El mismo mensaje se utiliza para aparecer cuando supe C#, solía usar TextPad con CSC, y ese mensaje solía aparecer sin añadir ningún Write (Línea)/Read (Línea) llamamientos

+0

Este [enlace] (http://stackoverflow.com/q/4834914/944628) funciona para mí con las teclas Ctrl + F5. Utilizo Visual Studio 2010. – leonardo

Respuesta

7

Se puede escribir una secuencia de comandos por lotes que se ejecuta el exe para usted y le pide al usuario que pulse una tecla.

La secuencia de comandos por lotes sería algo como esto:

echo off 
YourApp.exe 
pause 
+0

Gracias, TextPad genera automáticamente archivos de proceso por lotes. –

+2

Sugeriría la respuesta de Chalkey en su lugar. –

14

Eso no es posible. El aviso de presionar cualquier tecla es generado por Visual Studio cuando se ejecuta una aplicación de consola. No es parte de tu programa.

La única forma de hacerlo es mediante el uso de Console.Read() en el código

ACTUALIZACIÓN: con respecto a su observación sobre el uso de TextPad: No estoy familiarizado con TextPad, pero no me sorprendería si Textpad hizo lo mismo que Visual Studio al ejecutar una aplicación de consola.

+0

puede agregar la línea Console.Read() y comentar al entregar. Sin embargo, el mejor enfoque que conozco es usar el registro y registrar toda la información que necesita en un nivel inferior como Info o Trace o Debug y desearlo al enviar :-) –

+0

Consulte mi actualización más arriba. –

+0

OK, gracias. Con respecto a su actualización, como mencioné en mi comentario sobre la respuesta de Andrew, TextPad genera automáticamente archivos por lotes para lograr eso. –

2

Este comportamiento no tiene nada que ver con el compilador que está utilizando. Cuando compila con Visual Studio, ejecutar el ejecutable fuera de Visual Studio realmente funcionará exactamente igual que cuando compila con CSC en la línea de comando. Visual Studio (y TextPad) está agregando la lógica para agregar el mensaje "Presione cualquier tecla para continuar" en la consola.

Si desea que la aplicación permanezca abierta, tendrá que hacer algo como Console.ReadLine() para bloquear la ejecución de manera que su aplicación no completa su ejecución.

22

No tiene nada que ver con el compilador - si pulsa F5 para depurarlo en lugar de Ctrl-F5 para funcionar sin depurar, a continuación, VS no muestra el símbolo. Esto es presumiblemente para que no te pierdas el resultado que está produciendo.

Con el fin de hacer esto, Visual Studio se ejecuta cmd.exe diciendo que se ejecute el ejecutable y luego hacer una pausa:

"C:\WINDOWS\system32\cmd.exe" /c ""...\ConsoleApplication1.exe" & pause" 

Probablemente no lo hace cuando se depura ya que es un poco más difícil de conseguir la identificación del proceso de un niño de un proceso infantil.

Para agregar una opción similar a su programa, o bien utilizar un interruptor de línea de comandos para contar la propia aplicación para hacer una pausa, o utilizar un archivo por lotes para ejecutar entonces una pausa, o utilizar un acceso directo con ellos cmd.exe /c.

8

Puede hacer esto ...

static void Main(string[] args) 
{ 
#if DEBUG 
    Console.Read(); 
#endif 
} 

De esta forma, el programa no esperará la entrada de la consola cuando construya su aplicación como 'Versión'.

+0

Naoooo, esto causará cuelgues a menos que alguien haya pensado en agregar alguna entrada por cable antes de iniciar el script. p.ej. 'echo y | script.exe' para mantener la flexibilidad, es mucho mejor mantener la pausa fuera del programa. –

1

La pregunta es por qué le gustaría tener este comportamiento? La tecla Presionar cualquier tecla para continuar está allí para que pueda ver el resultado de su aplicación. Si, por otro lado, construye su código y lo ejecuta desde un símbolo del sistema (consola), esto no se cerrará cuando la aplicación finalice, por lo que puede ver el resultado.

Como se indicó anteriormente, presionar cualquier tecla para continuar es una función del IDE y no está relacionada con el código que está escribiendo. El propósito de esa característica es permitirle ver la salida de su aplicación de consola.

2

Puede hacer esto, si desea la misma funcionalidad cuando se depura.

if (Debugger.IsAttached) 
{ 
    Console.WriteLine("Press any key to continue . . ."); 
    Console.ReadKey(true); 
} 
+0

que no respeta ni a c14n ni a i11n. –

+0

No hay forma de realizar i11n en esto, ya que las cadenas de recursos, utilizadas por Visual Studio, no están fácilmente disponibles. Realmente no estoy seguro de lo que quieres decir con c14n, no parece relevante para la pregunta formulada. – Siewers

+0

No está canonicalizado (c14n) porque reproduce una característica que ya existe (pausa). pero no renuncié porque también uso esta técnica yo mismo. A veces simplemente no queremos preocuparnos por la mierda. Si hace el trabajo lo suficiente. –

Cuestiones relacionadas