2008-10-02 33 views
81

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í?¿No hay salida a la consola desde una aplicación WPF?

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

Todo lo que necesito para 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? :-) Voy a utilizar System.Diagnostics.Trace.WriteLine() y DebugView por ahora.

+0

duplicados posibles [ aquí] (http://stackoverflow.com/questions/3057852/how-do-i-write-to-command-line-from-a-wpf-application/3058921#3058921) y [aquí] (http: // stackoverflow.com/questions/10415807/output-console-writeline-from-wpf-windows-applications-to-actual-console) (más reciente, pero con algunas respuestas interesantes usando [AttachConsole from Kernel32.dll] (https: // msdn) .microsoft.com/es-us/library/windows/desktop/ms681952% 28v = vs.85% 29.aspx)) – Max

+1

@Max, esas preguntas son posibles duplicados de * esta * pregunta. Esta pregunta se hizo 2-4 años antes de cualquiera de las preguntas que publicó. –

Respuesta

78

que 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 de 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, sólo tiene que escribir ConsoleManager.Show() algún lugar antes de cualquier llamada 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; } 
    } 

    /// <summary> 
    /// Creates a new console instance if the process is not attached to a console already. 
    /// </summary> 
    public static void Show() 
    { 
     //#if DEBUG 
     if (!HasConsole) 
     { 
      AllocConsole(); 
      InvalidateOutAndError(); 
     } 
     //#endif 
    } 

    /// <summary> 
    /// 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. 
    /// </summary> 
    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); 
    } 
} 
+0

Me gusta esto, funciona, y puedo usar esto en otros proyectos. Sin embargo, debido a que lanza una nueva ventana de consola, causa un problema con un proyecto actual. Si paso en las opciones de la línea de comando, me gustaría poder enviar a la consola desde la que se lanzó, para que el usuario obtenga el resultado allí.En mi aplicación, si se proporcionan opciones de línea de comandos, se queda una aplicación de consola y luego hace su trabajo y luego sale. Esto permite que la aplicación se automatice y programe para realizar tareas, o el usuario puede hacer algo rápidamente y salir. Sin embargo, quiero mostrar algunas cosas, como el material de ayuda, etc. –

+0

Buen truco con la configuración de _out y _error en null. ¡Inteligente! – BFree

+0

¿Es posible incrustar la ventana de la consola dentro de una ventana de WPF usando esta o cualquier otra técnica? – InfinitiesLoop

-14

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

+1

No sé sobre WPF, pero ciertamente este no es el caso de WinForms. Console.WriteLine funciona bien allí, pero, por supuesto, no verá la consola, la verá en la ventana de salida del depurador y si escucha la salida estándar. –

+2

puede configurar el proyecto en una aplicación de consola y seguirá ejecutándose como una aplicación de Windows pero también tendrá una consola visible –

+0

Eso es incorrecto, el proceso de compilación de una aplicación que no es de consola no asocia una consola por deffault. Puede hacerlo manualmente llamando a la función AllocConsole() Win32 API antes de llamar a Console.Write, la clase Console se inicializará para que funcione con esa ventana de consola. –

102

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.

+1

El único problema es que tendrá un cmd abierto en el fondo, pero funciona :). – ykatchou

+4

Genial, pero la ventana de línea de comandos se creará cuando la aplicación no se ejecute desde cmd.exe (dos ventanas creadas para una aplicación). Pero para esto también hay una solución: puede ocultar la ventana de cmd mediante ShowWindow (hWnd, 0). http://stackoverflow.com/a/10416180/1457197. Al usar esta solución, verá texto en la consola solo cuando la aplicación WPF se ejecute desde la línea de comandos. – CoperNick

+0

Tenga en cuenta que tendrá que volver a cambiar a "Aplicación de ventana" mientras trabaja en Mezcla, ya que solo muestra XAML (sin acceso a la Vista de diseño) para los tipos de "Aplicación de consola". (a partir de Blend 2013) –

91

Puede utilizar

Trace.WriteLine("text"); 

Esta es la salida a la ventana de "Salida" en Visual Studio (al depurar).

asegurarse de tener los diagnósticos de montaje incluido:

using System.Diagnostics; 
+0

Fácil, simple. Thx – rluks

+7

esta es la mejor respuesta, pero no tiene la calificación más alta – kiltek

+0

Estoy de acuerdo, esto es exactamente lo que está pidiendo. Gran alternativa a Console.WriteLine(): la solución marcada como la respuesta es un ejercicio ordenado pero no razonable de incluir en una aplicación de producción. – nocarrier

3

utilizo Console.WriteLine() para su uso en la ventana de resultados ...

+4

Es una pregunta de 4 años que se ha editado mucho desde que la vi por primera vez. Ahora, por supuesto, la pregunta ha sido mejor redactada y mi respuesta fue irrelevante. – erodewald

9

Aunque John Leidegren mantiene el derribo de la idea, Brian es correcta. Lo acabo de hacer funcionar en Visual Studio.

Para que quede claro, una aplicación WPF no crea una ventana de Consola de manera 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.

+1

Perfecto. Hace el trabajo. – frostymarvelous

8

Es posible ver la salida prevista para la consola utilizando command line redirection.

Por ejemplo:

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

escribirá todo el contenido a output.txt archivo.

4

Mensaje viejo, pero me encontré con esto por lo que si usted está tratando de demostrar algo a la salida de un proyecto de WPF en Visual Studio, el método actual es:

incluir lo siguiente:

using System.Diagnostics; 

Y luego:

Debug.WriteLine("something"); 
Cuestiones relacionadas