Tener la salida de una aplicación de consola en Visual Studio en lugar de la consola

120

Al hacer una aplicación de consola en Java con Eclipse, veo que la salida se coloca en un cuadro de texto en el propio IDE, en lugar de que aparezca una consola como en Visual Studio. Esto es útil, ya que incluso después de que el programa haya salido, todavía puedo hacer un buen uso del texto que estaba escrito en él, ya que no se borra hasta que lo vuelvo a ejecutar. ¿Es posible lograr algo así con Visual Studio? Yo se que en lugar de hacer

System.Console.WriteLine(str);

puedo hacer

System.Diagnostics.Debug.WriteLine(str);

pero no es exactamente lo mismo, ya que obtiene una gran cantidad de "basura" en la ventana de Salida, como todos los símbolos cargados y demás.

Aún mejor, ¿es posible hacer todo en el propio IDE, cuando ejecuta su aplicación, en lugar de tener la consola en ejecución?

elisio devorado
fuente
¿Qué versión de VS estás usando?
Gabe
¿Tiene un panel de Resultados de la prueba?
Gabe
Nunca lo he notado. Lo revisaré. ¿Debería tenerlo?
devoró elisio

Respuestas:

52

En Herramientas -> Cuadro de diálogo Opciones de Visual Studio -> Depuración -> Marque "Redirigir todo el texto de la ventana de salida a la ventana inmediata".

SharpSteve
fuente
68
He marcado esta casilla de verificación, pero todavía aparece una ventana emergente de consola y nada en la ventana "Salida" (Depurar, Probar, Compilar, ..) o la "Ventana Inmediata".
GuiSim
6
@EvenLisle, debe cambiar el tipo de aplicación a Aplicación de Windows como en la respuesta de stolsvik . La opción mencionada en esta respuesta estaba activada de forma predeterminada para mí en cualquier caso.
TooTone
3
¿Qué significa exactamente "Redirigir todo el texto de la ventana de salida a la ventana inmediata"? Utilice varios contextos si es necesario. Estoy confundido por lo que es la "ventana inmediata".
Xonatron
11
@TooTone La pregunta establece claramente una "aplicación de consola" y cambiarla a otra cosa solo con fines de depuración, donde ni siquiera puedo Console.ReadKey () ¡ es simplemente ridículo!
MickyD
1
Solo funciona con Debug.WriteLine (), no funciona con Console.WriteLine () :(
Y2i
45

En el cuadro de diálogo Opciones de Visual Studio -> Depuración -> Marque "Redirigir todo el texto de la ventana de salida a la ventana inmediata". Luego vaya a la configuración de su proyecto y cambie el tipo de "Aplicación de consola" a "Aplicación de Windows". En ese momento, Visual Studio ya no abre una ventana de consola y la salida se redirige a la ventana de Salida en Visual Studio. Sin embargo, no puede hacer nada "creativo", como solicitar una clave o entrada de texto, o borrar la consola; obtendrá excepciones de tiempo de ejecución.

Stolsvik
fuente
25
Encuentro esto particularmente torpe. ¿Cuál es, me pregunto, la razón de ser de esto en VS? Debería ser la capacidad de todos los IDE de hoy en día tener un panel dentro del propio IDE que se comporte como la consola de entrada y salida. (se rasca la cabeza)
12
La pregunta establece claramente una "aplicación de consola" y cambiarla a otra cosa solo con fines de depuración, donde ni siquiera puedo Console.ReadKey()es simplemente ridículo.
MickyD
No estoy seguro de por qué, pero cuando traté de revertir el Output typede mi aplicación de la Aplicación de Windows a la Consola, la ventana de la consola no se ve cuando ejecuto mi aplicación. Puedo depurar la aplicación y el Mainpunto de entrada también está siendo afectado. También revirtí la configuración de la opción mencionada en esta publicación, pero fue en vano. Estoy usando la edición de la comunidad VS 2017. Perdí la ventana de mi consola (sollozos).
RBT
3
Por lo que vale, en VS 15.8.7 la única forma en que podía hacer que la salida se redirigiera para una aplicación de consola era cambiarla a una aplicación de Windows y dejar el cuadro de redirección SIN MARCAR. Si marco la casilla, no muestra la salida.
dpberry178
6

Utilizar System.Diagnostics.Trace

Dependiendo de los oyentes que adjunte, la salida de seguimiento puede ir a la ventana de depuración, la consola, un archivo, una base de datos o todo a la vez. Las posibilidades son literalmente infinitas, ya que implementar su propio TraceListener es extremadamente simple.

Joel Coehoorn
fuente
Sí, pero lo que quiero saber es si es posible hacerlo sin tener que implementarlo yo mismo.
Devoró elisio
@devoured La clase Trace genera solo en la ventana de depuración de forma predeterminada. Solo necesita adjuntar oyentes adicionales (y hay varios ya escritos que puede usar) si desea ver también la salida en otro lugar.
Joel Coehoorn
1
Fui a mi cuadro de diálogo Opciones de depuración y elegí "Redirigir todo el texto de la ventana de salida a la ventana Inmediato" para que la salida de Trace vaya a la ventana Inmediato para que no se mezcle con la basura de depuración.
Gabe
2

Es hora de comprobar las últimas versiones de Visual Studio, amigos. La solución más sugerida que no funcionó para algunos de ustedes antes podría funcionar ahora.

En Visual Studio 2017 ( versión de lanzamiento 15.4.2 y superior), ir Tools > Options > Debugging > General > (Check Box) Redirect all Output Window text to Immediate Windowme ha funcionado.

Algunas notas: 1. Para ver la ventana Inmediato, asegúrese de estar en modo Depuración . 2. Ahora debería haber otras 3 herramientas de depuración disponibles a su disposición, a saber, Pila de llamadas, Puntos de interrupción y Ventana de comandos, como se muestra a continuación:

ingrese la descripción de la imagen aquí

¡Los mejores deseos!

Kuzevni
fuente
Probado en v15.9.4, no funciona (no para una aplicación de consola, al menos).
bta
Hmm. Si puede compartir una captura de pantalla de sus configuraciones, puedo intentar replicar el problema por mi parte. De lo contrario, puede compartir su solución si se ha resuelto. Las notas de la versión para Visual Studio 15.9.4 están disponibles en docs.microsoft.com/en-us/visualstudio/releasenotes/… . Allí puede encontrar algunos consejos útiles según su entorno. Documentación de Visual Studio 2017 (ventana de salida) : docs.microsoft.com/en-us/visualstudio/ide/reference/…
kuzevni
Verifique que el proyecto con el que está probando se haya creado como una "aplicación de consola", no como una "aplicación de Windows". Su enfoque funciona con una aplicación de Windows, pero eso no es lo que especificó el OP.
bta
1

Puede crear una aplicación contenedora que ejecute en lugar de ejecutar directamente su aplicación real. La aplicación contenedora puede escuchar stdout y redirigir todo a Trace. Luego, cambie la configuración de ejecución para iniciar su contenedor y pasar la ruta a la aplicación real para ejecutar.

También puede hacer que el contenedor adjunte automáticamente el depurador al nuevo proceso si se adjunta un depurador al contenedor.

Samuel Neff
fuente
0

Sé que esta es solo otra respuesta, pero pensé en escribir algo para los nuevos desarrolladores web, que podrían confundirse con la parte "Cambiar a una aplicación de Windows", porque creo que, de forma predeterminada, una aplicación MVC en Visual Studio 2013 tiene como valor predeterminado un Tipo de salida de biblioteca de clases.

Mi aplicación web está configurada de forma predeterminada como un tipo de salida de "Biblioteca de clases". No tienes que cambiar eso. Todo lo que tenía que hacer era seguir las sugerencias de ir a Herramientas> Opciones> Depuración> Redirigir todo el texto de la ventana de salida a la ventana inmediata. Luego utilicé la System.Diagnostics.Tracesugerencia de Joel Coehoorn anterior.

joshmcode
fuente
0

Una solución simple que funciona para mí, trabajar con la capacidad de la consola (ReadKey, String con formato y arg, etc.) y ver y guardar la salida:

Escribo TextWriter que escribe ay Consolepara Tracey reemplaza el Console.Outcon él.

si usa Diálogo -> Depuración -> Marque "Redirigir todo el texto de la ventana de salida a la ventana inmediata", lo obtendrá en la ventana inmediata y bastante limpio.

mi código: al comienzo de mi código:

   Console.SetOut(new TextHelper());

y la clase:

public class TextHelper : TextWriter
    {
        TextWriter console;

        public TextHelper() {
            console = Console.Out;
        }

        public override Encoding Encoding { get { return this.console.Encoding; } }
        public override void WriteLine(string format, params object[] arg)
        {
            string s = string.Format(format, arg);
            WriteLine(s);
        }
        public override void Write(object value)
        {
            console.Write(value);
            System.Diagnostics.Trace.Write(value);
        }

        public override void WriteLine(object value)
        {
            Write(value);
            Write("\n");
        }
        public override void WriteLine(string value)
        {
            console.WriteLine(value);
            System.Diagnostics.Trace.WriteLine(value);

        }

    }

Nota: anulo justo lo que necesitaba, así que si escribe otros tipos, debería anular más

Sarel Foyerlicht
fuente
0

con respecto a System.Diagnostics.Debugproducir una gran cantidad de "basura" en la ventana de salida: puede desactivar eso haciendo clic derecho en la ventana de salida. Por ejemplo, hay un elemento "Mensajes de carga del módulo" que desea deshabilitar y un elemento "Salida del programa" que desea conservar.

user829755
fuente
0

Tienes tres posibilidades para hacer esto, pero no es trivial. La idea principal de todos los IDE es que todos son los padres de los procesos secundarios (depuración). En este caso, es posible manipular con entrada, salida y controlador de errores estándar. Por lo tanto, los IDE inician aplicaciones secundarias y las redireccionan a la ventana de salida interna. Conozco una posibilidad más, pero vendrá en el futuro.

  1. Puede implementar su propio motor de depuración para Visual Studio. Debug Engine controla el inicio y la depuración de la aplicación. Puede encontrar ejemplos de cómo hacerlo en docs.microsoft.com ( motor de depuración de Visual Studio )
  2. Redirigir la aplicación de formulario usando la duplicación del controlador estándar para c ++ o use Console.SetOut (TextWriter) para c #. Si necesita imprimir en la ventana de salida, debe usar la extensión SDK de Visual Studio. Ejemplo de la segunda variante que puedes encontrar en Github .
  3. Inicie la aplicación que usa System.Diagnostics.Debug.WriteLine (para imprimir en la salida) y luego iniciará la aplicación secundaria. Al iniciar un hijo, debe redirigir stdout al padre con tuberías. Puede encontrar un ejemplo en MSDN. Pero creo que esta no es la mejor forma.
Galina Khrychikova
fuente
0

Si necesita la salida de Console.WriteLine, y Redirigir todo el texto de la ventana de salida a la ventana inmediata no funciona y necesita conocer la salida de las pruebas del Explorador de pruebas integrado, utilizando NUnit.Framework, nuestro problema ya está resuelto en VS 2017 :

Ejemplo tomado de C # In Depth por Jon Skeet: Ejemplo tomado de C # en profundidad por Jon Skeet Esto produce esta salida en Text Explorer: Explorador de tareas

Cuando hacemos clic en Salida azul, en Tiempo transcurrido, a la derecha, y produce esto: Salida estándar

La salida estándar es nuestra salida deseada, producida por Console.WriteLine.

Funciona para la consola y para las aplicaciones de Windows Forms en VS 2017, pero solo para la salida generada para Test Explorer en Debug o Run; de todos modos, esta es mi principal necesidad de la salida Console.WriteLine.

Marcelo Scofano
fuente
-1

En su lugar, puede recopilar la salida en un resultado de prueba.

No puede proporcionar entrada, pero puede proporcionar fácilmente varias pruebas con diferentes argumentos de línea de comando, cada prueba recopila la salida.

Si su objetivo es depurar, esta es una forma de bajo esfuerzo para ofrecer un escenario de depuración repetible.

namespace Commandline.Test
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    [TestClass]
    public class CommandlineTests
    {
        [TestMethod]
        public void RunNoArguments()
        {
            Commandline.Program.Main(new string[0]);
        }
    }
}
uffehellum
fuente
-7

Paso 1: haga clic con el botón derecho en el nombre del proyecto en el Explorador de soluciones y luego haga que el tipo de salida sea Aplicación de ventana

Paso 2: Depurar -> Opciones ..--> Depurar (expandir) -> General -> Redirigir todo el texto de la ventana de salida a la ventana inmediata

Balaji Dinakaran
fuente
3
Esta respuesta se ha dado tres veces anteriormente. No aborda la pregunta formulada.
Klay