No hay salida a la consola desde una aplicación WPF?

Estoy usando Console.WriteLine () desde una aplicación de prueba WPF muy simple, pero cuando ejecuto la aplicación desde la línea de comandos, no veo nada escrito en la consola. ¿Alguien sabe lo que podría estar pasando aquí?

Puedo reproducirlo creando una aplicación WPF en VS 2008 y simplemente agregando Console.WriteLine (“texto”) en cualquier lugar que se ejecute. ¿Algunas ideas?

Todo lo que necesito por ahora es algo tan simple como Console.WriteLine (). Me doy cuenta de que podría usar log4net o alguna otra solución de registro, pero realmente no necesito tanta funcionalidad para esta aplicación.

Editar: debería haber recordado que Console.WriteLine () es para aplicaciones de consola. Bueno, no hay preguntas estúpidas, ¿verdad? 🙂 Solo usaré System.Diagnostics.Trace.WriteLine () y DebugView por ahora.

Tendrá que crear una ventana de consola manualmente antes de llamar a cualquier método Console.Write. Eso iniciará la consola para que funcione correctamente sin cambiar el tipo de proyecto (que para la aplicación WPF no funcionará).

Aquí hay un ejemplo completo del código fuente, de cómo se vería una clase de ConsoleManager, y cómo se puede usar para habilitar / deshabilitar la consola, independientemente del tipo de proyecto.

Con la siguiente clase, solo necesita escribir ConsoleManager.Show() algún lugar antes de llamar a Console.Write

 [SuppressUnmanagedCodeSecurity] public static class ConsoleManager { private const string Kernel32_DllName = "kernel32.dll"; [DllImport(Kernel32_DllName)] private static extern bool AllocConsole(); [DllImport(Kernel32_DllName)] private static extern bool FreeConsole(); [DllImport(Kernel32_DllName)] private static extern IntPtr GetConsoleWindow(); [DllImport(Kernel32_DllName)] private static extern int GetConsoleOutputCP(); public static bool HasConsole { get { return GetConsoleWindow() != IntPtr.Zero; } } ///  /// Creates a new console instance if the process is not attached to a console already. ///  public static void Show() { //#if DEBUG if (!HasConsole) { AllocConsole(); InvalidateOutAndError(); } //#endif } ///  /// If the process has a console attached to it, it will be detached and no longer visible. Writing to the System.Console is still possible, but no output will be shown. ///  public static void Hide() { //#if DEBUG if (HasConsole) { SetOutAndErrorNull(); FreeConsole(); } //#endif } public static void Toggle() { if (HasConsole) { Hide(); } else { Show(); } } static void InvalidateOutAndError() { Type type = typeof(System.Console); System.Reflection.FieldInfo _out = type.GetField("_out", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); System.Reflection.FieldInfo _error = type.GetField("_error", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); System.Reflection.MethodInfo _InitializeStdOutError = type.GetMethod("InitializeStdOutError", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); Debug.Assert(_out != null); Debug.Assert(_error != null); Debug.Assert(_InitializeStdOutError != null); _out.SetValue(null, null); _error.SetValue(null, null); _InitializeStdOutError.Invoke(null, new object[] { true }); } static void SetOutAndErrorNull() { Console.SetOut(TextWriter.Null); Console.SetError(TextWriter.Null); } } 

Haga clic derecho en el proyecto, “Propiedades”, pestaña “Aplicación”, cambie “Tipo de salida” a “Aplicación de consola”, y luego también tendrá una consola.

Puedes usar

 Trace.WriteLine("text"); 

Esto saldrá a la ventana “Salida” en Visual Studio (cuando se depura).

asegúrese de tener el ensamblaje de Diagnóstico incluido:

 using System.Diagnostics; 

Aunque John Leidegren sigue disparando la idea, Brian está en lo cierto. Lo acabo de hacer funcionar en Visual Studio.

Para que quede claro, una aplicación WPF no crea una ventana de Consola de forma predeterminada.

Debe crear una aplicación WPF y luego cambiar el OutputType a “Aplicación de consola”. Cuando ejecutas el proyecto, verás una ventana de consola con tu ventana de WPF frente a él.

No parece muy bonito, pero lo encontré útil ya que quería que mi aplicación se ejecutara desde la línea de comandos con comentarios allí, y luego para ciertas opciones de comando, mostraría la ventana de WPF.

Es posible ver resultados destinados a la consola mediante el uso de la redirección de línea de comandos .

Por ejemplo:

 C:\src\bin\Debug\Example.exe > output.txt 

escribirá todo el contenido en el archivo output.txt .

Publicación anterior, pero me encontré con esto, por lo que si intentas enviar algo a Output en un proyecto de WPF en Visual Studio, el método actual es:

Incluye esto:

 using System.Diagnostics; 

Y entonces:

 Debug.WriteLine("something"); 

Yo uso Console.WriteLine () para usar en la ventana de Salida …

Creé una solución, mezclé la información de varius post.

Es una forma, que contiene una etiqueta y un cuadro de texto. La salida de la consola se redirige al cuadro de texto.

También hay una clase llamada ConsoleView que implementa tres métodos públicos: Show (), Close () y Release (). El último es para dejar abierto la consola y activar el botón Cerrar para ver los resultados.

Los formularios se llaman FrmConsole. Aquí están los códigos XAML y c #.

El uso es muy simple:

 ConsoleView.Show("Title of the Console"); 

Para abrir la consola. Utilizar:

 System.Console.WriteLine("The debug message"); 

Para texto de salida a la consola.

Utilizar:

 ConsoleView.Close(); 

Para cerrar la consola.

 ConsoleView.Release(); 

Deja abierta la consola y habilita el botón Cerrar

XAML

                   

El código de la ventana:

 partial class FrmConsole : Window { private class ControlWriter : TextWriter { private TextBox textbox; public ControlWriter(TextBox textbox) { this.textbox = textbox; } public override void WriteLine(char value) { textbox.Dispatcher.Invoke(new Action(() => { textbox.AppendText(value.ToString()); textbox.AppendText(Environment.NewLine); textbox.ScrollToEnd(); })); } public override void WriteLine(string value) { textbox.Dispatcher.Invoke(new Action(() => { textbox.AppendText(value); textbox.AppendText(Environment.NewLine); textbox.ScrollToEnd(); })); } public override void Write(char value) { textbox.Dispatcher.Invoke(new Action(() => { textbox.AppendText(value.ToString()); textbox.ScrollToEnd(); })); } public override void Write(string value) { textbox.Dispatcher.Invoke(new Action(() => { textbox.AppendText(value); textbox.ScrollToEnd(); })); } public override Encoding Encoding { get { return Encoding.UTF8; } } } //DEFINICIONES DE LA CLASE #region DEFINICIONES DE LA CLASE #endregion //CONSTRUCTORES DE LA CLASE #region CONSTRUCTORES DE LA CLASE public FrmConsole(string titulo) { InitializeComponent(); lblTitulo.Content = titulo; Clear(); btnCerrar.Click += new RoutedEventHandler(BtnCerrar_Click); Console.SetOut(new ControlWriter(txtInner)); DesactivarCerrar(); } #endregion //PROPIEDADES #region PROPIEDADES #endregion //DELEGADOS #region DELEGADOS private void BtnCerrar_Click(object sender, RoutedEventArgs e) { Close(); } #endregion //METODOS Y FUNCIONES #region METODOS Y FUNCIONES public void ActivarCerrar() { btnCerrar.IsEnabled = true; } public void Clear() { txtInner.Clear(); } public void DesactivarCerrar() { btnCerrar.IsEnabled = false; } #endregion } 

el código de la clase ConsoleView

 static public class ConsoleView { //DEFINICIONES DE LA CLASE #region DEFINICIONES DE LA CLASE static FrmConsole console; static Thread StatusThread; static bool isActive = false; #endregion //CONSTRUCTORES DE LA CLASE #region CONSTRUCTORES DE LA CLASE #endregion //PROPIEDADES #region PROPIEDADES #endregion //DELEGADOS #region DELEGADOS #endregion //METODOS Y FUNCIONES #region METODOS Y FUNCIONES public static void Show(string label) { if (isActive) { return; } isActive = true; //create the thread with its ThreadStart method StatusThread = new Thread(() => { try { console = new FrmConsole(label); console.ShowDialog(); //this call is needed so the thread remains open until the dispatcher is closed Dispatcher.Run(); } catch (Exception) { } }); //run the thread in STA mode to make it work correctly StatusThread.SetApartmentState(ApartmentState.STA); StatusThread.Priority = ThreadPriority.Normal; StatusThread.Start(); } public static void Close() { isActive = false; if (console != null) { //need to use the dispatcher to call the Close method, because the window is created in another thread, and this method is called by the main thread console.Dispatcher.InvokeShutdown(); console = null; StatusThread = null; } console = null; } public static void Release() { isActive = false; if (console != null) { console.Dispatcher.Invoke(console.ActivarCerrar); } } #endregion } 

Espero que este resultado sea útil.

Mira esta publicación, fue muy útil para mí. Descargue la muestra del código:

http://www.codeproject.com/Articles/335909/Embedding-a-Console-in-aC-Application

Por lo que sé, Console.WriteLine () es solo para aplicaciones de consola. Creo que este es tu problema