Para quedar atrapado de inmediato, un ejemplo muy básico:
using System;
using System.Windows.Forms;
class test
{
static void Main()
{
Console.WriteLine("test");
MessageBox.Show("test");
}
}
Si compilo esto con las opciones predeterminadas (usando csc en la línea de comando), como se esperaba, se compilará en una aplicación de consola. Además, porque importé System.Windows.Forms
, también mostrará un cuadro de mensaje.
Ahora, si uso la opción /target:winexe
, que creo que es lo mismo que elegir Windows Application
dentro de las opciones del proyecto, como se esperaba, solo veré el cuadro de mensaje y no habrá salida de la consola.
(De hecho, en el momento en que se inicia desde la línea de comandos, puedo emitir el siguiente comando incluso antes de que la aplicación se haya completado).
Entonces, mi pregunta es: sé que puede obtener resultados de "ventanas" / formularios desde una aplicación de consola, pero ¿hay alguna forma de mostrar la consola desde una aplicación de Windows?
Respuestas:
Este debería funcionar.
fuente
>
para redirigir la salida, obtengo una ventana de consola separada y cero salida en mi archivo.Quizás esto sea demasiado simplista ...
Crear un proyecto de Windows Form ...
Luego: Propiedades del proyecto -> Aplicación -> Tipo de salida -> Aplicación de consola
Entonces puede tener la consola y los formularios funcionando juntos, funciona para mí
fuente
>
. Sin embargo, esperaba una solución que explicara cómo ejecutarse como una "Aplicación de consola" solo algunas veces (es decir, habilitar programáticamente lo que sea que cambie esta configuración misteriosa de Visual Studio). ¿Alguien sabe cómo funciona esto bajo el capó?Si no le preocupa abrir un comando de consola, puede acceder a las propiedades de su proyecto y cambiarlo a Aplicación de consola
.
Esto seguirá mostrando su formulario, así como una ventana emergente de la consola. No puede cerrar la ventana de la consola, pero funciona como un excelente registrador temporal para la depuración.
Solo recuerde desactivarlo antes de implementar el programa.
fuente
Puede llamar
AttachConsole
usando pinvoke para obtener una ventana de consola adjunta a un proyecto WinForms: http://www.csharp411.com/console-output-from-winforms-application/También puede considerar Log4net ( http://logging.apache.org/log4net/index.html ) para configurar la salida del registro en diferentes configuraciones.
fuente
Esto funcionó para mí, para canalizar la salida a un archivo. Llama a la consola con
Agregue este código a su aplicación.
Encontré este código aquí: http://www.csharp411.com/console-output-from-winforms-application/ Pensé que valía la pena publicarlo aquí también.
fuente
AttachConsole(ATTACH_PARENT_PROCESS)
obtengo la salida de la consola, pero la redirección en la línea de comando>
no funciona. Cuando intento esta respuesta, no puedo obtener ningún resultado, ya sea en la consola o en un archivo.Básicamente, hay dos cosas que pueden suceder aquí.
Salida de la consola Es posible que un programa winforms se una a la ventana de la consola que lo creó (o a una ventana de consola diferente, o incluso a una nueva ventana de consola si lo desea). Una vez conectado a la ventana de la consola, Console.WriteLine (), etc. funciona como se esperaba. Uno de los problemas con este enfoque es que el programa devuelve el control a la ventana de la consola inmediatamente y luego continúa escribiendo en él, de modo que el usuario también puede escribir en la ventana de la consola. Puede usar start con el parámetro / wait para manejar esto, creo.
Enlace para iniciar la sintaxis del comando
Salida de consola redirigida Esto es cuando alguien canaliza la salida de su programa en otro lugar, por ejemplo.
yourapp> file.txt
Adjuntar a una ventana de consola en este caso efectivamente ignora la tubería. Para que esto funcione, puede llamar a Console.OpenStandardOutput () para obtener un identificador de la secuencia a la que se debe canalizar la salida. Esto solo funciona si la salida se canaliza, por lo que si desea manejar ambos escenarios, debe abrir la salida estándar y escribir en ella y adjuntarla a la ventana de la consola. Esto significa que la salida se envía a la ventana de la consola y a la tubería, pero es la mejor solución que pude encontrar. Debajo del código que uso para hacer esto.
fuente
Console.WriteLine
para llamar a la nuevaWriteLine
definida anteriormente. Aunque probé que no podía con este código redirigir nada a un archivo al ejecutar la aplicación en la línea de comando y redirigir>
a un archivo.Console.WriteLine
es solo una buena práctica, ya que le permite probar y cambiar fácilmente los lugares en los que inicia sesión (por ejemplo, es posible que desee comenzar a iniciar sesión en un servicio de registro basado en la nube como PaperTrail, o lo que sea )StreamWriter _stdOutWriter;
Cree una aplicación de formularios Windows Forms y cambie el tipo de salida a Consola.
Resultará en una consola y el formulario para abrir.
fuente
fuente
fuente
StandardHandle : uint
está mal aquí ... debería ser IntPtr para trabajar tanto en x86 como en x64En cualquier momento puede cambiar entre tipos de aplicaciones, consolas o ventanas. Por lo tanto, no escribirá una lógica especial para ver el stdout. Además, al ejecutar la aplicación en el depurador, verá todas las stdout en la ventana de salida. También puede agregar un punto de interrupción y, en las propiedades del punto de interrupción, cambiar "Cuando se golpea ...", puede generar mensajes y variables. También puede marcar / desmarcar "Continuar ejecución", y su punto de interrupción tendrá forma cuadrada. Entonces, los mensajes de punto de interrupción sin cambiar nada en la aplicación en la ventana de salida de depuración.
fuente
¿Por qué no simplemente dejarlo como una aplicación de Windows Forms y crear un formulario simple para imitar la consola? Se puede hacer que el formulario se parezca a la consola con pantalla negra y que responda directamente al presionar una tecla. Luego, en el archivo program.cs, usted decide si necesita ejecutar el formulario principal o el ConsoleForm. Por ejemplo, uso este enfoque para capturar los argumentos de la línea de comandos en el archivo program.cs. Creo el ConsoleForm, inicialmente lo oculto, luego paso las cadenas de la línea de comandos a una función AddCommand, que muestra los comandos permitidos. Finalmente, si el usuario dio -h o -? comando, llamo al .Show en ConsoleForm y cuando el usuario toca cualquier tecla, apago el programa. Si el usuario no da el -? comando, cierro el ConsoleForm oculto y ejecuto el formulario principal.
fuente