104 votes

Pas de sortie vers la console depuis une application WPF?

Je suis à l'aide de la Console.WriteLine() à partir d'un très simple WPF application de test, mais quand je exécuter l'application à partir de la ligne de commande, je vois que rien n'ait été écrit dans la console. Personne ne sait ce qui pourrait se passer ici?

Je peux le reproduire par la création d'une application WPF dans VS 2008, et tout simplement l'ajout de la Console.WriteLine("texte") n'importe où qui est exécutée. Des idées?

Tout ce que je besoin maintenant, c'est que quelque chose d'aussi simple que la Console.WriteLine(). Je me rends compte que je pouvais utiliser log4net ou somet autre solution d'enregistrement, mais je n'ai vraiment pas besoin de beaucoup plus de fonctionnalités pour cette application.

Edit: je devrais avoir rappelé que la Console.WriteLine() pour les applications de console. Eh bien, pas de questions stupides, droit? :-) Je vais juste utiliser le Système.Diagnostics.Trace.WriteLine() et DebugView pour l'instant.

124voto

Brian Points 82719

Faites un clic droit sur le projet, "Propriétés", onglet "Application", changez "Type de sortie" en "Application console", et il aura également une console.

112voto

Phobis Points 3070

Vous pouvez utiliser

 Trace.WriteLine("text");
 

Cela sera affiché dans la fenêtre "Sortie" de Visual Studio (lors du débogage).

assurez-vous que l’assemblage Diagnostics est inclus:

 using System.Diagnostics;
 

90voto

John Leidegren Points 21951

Vous aurez à créer une fenêtre de Console manuellement avant d'appeler n'importe quelle Console.Méthodes d'écriture. Qui initialisation de la Console pour fonctionner correctement sans changer le type de projet (qui, pour l'application WPF ne fonctionnera pas).

Voici un exemple de code source, de la façon dont un ConsoleManager classe pourrait ressembler, et comment il peut être utilisé pour activer/désactiver la Console, indépendamment du type de projet.

Avec la classe suivante, vous avez juste besoin d'écrire ConsoleManager.Show() quelque part, avant tout appel à l' 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);
    }
}

10voto

Lu55 Points 2339

Il est possible de voir la sortie destinée à la console en utilisant la redirection en ligne de commande .

Par exemple:

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

va écrire tout le contenu dans le fichier output.txt .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X