Нет вывода на консоль из приложения WPF?

Я использую Console.WriteLine() из очень простого тестового приложения WPF, но когда я запускаю приложение из командной строки, я вижу, что ничего не записывается на консоль. Кто-нибудь знает, что может происходить здесь?

Я могу воспроизвести его, создав приложение WPF в VS 2008 и просто добавляя Console.WriteLine( "текст" ) в любом месте, которое выполняется. Любые идеи?

Все, что мне нужно сейчас, - это просто, как Console.WriteLine(). Я понимаю, что могу использовать log4net или somet другое решение для регистрации, но мне действительно не нужна такая функциональность для этого приложения.

Изменить: Я должен был помнить, что Console.WriteLine() предназначен для консольных приложений. О, ну, никаких глупых вопросов, верно?:-) Я просто буду использовать System.Diagnostics.Trace.WriteLine() и DebugView.

Ответ 1

Вам нужно будет создать окно консоли вручную, прежде чем вы назовете какие-либо методы Console.Write. Это запустит Console для правильной работы без изменения типа проекта (который для приложения WPF не будет работать).

Здесь приведен полный пример исходного кода, как выглядит класс ConsoleManager, и как его можно использовать для включения/отключения Консоли, независимо от типа проекта.

В следующем классе вам просто нужно написать ConsoleManager.Show() где-нибудь перед любым вызовом 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);
    }
} 

Ответ 2

Щелкните правой кнопкой мыши по проекту, вкладкам "Свойства", "Приложение", измените "Тип вывода" на "Консольное приложение", а затем он также будет иметь консоль.

Ответ 3

Вы можете использовать

Trace.WriteLine("text");

Это будет выводиться в окно "Выход" в Visual Studio (при отладке).

обязательно включите сборку диагностики:

using System.Diagnostics;

Ответ 4

Хотя Джон Лейдегрен продолжает снимать эту идею, Брайан прав. Я только что начал работать в Visual Studio.

Чтобы быть ясным, приложение WPF по умолчанию не создает окно консоли.

Вам необходимо создать приложение WPF, а затем изменить тип OutputType на "Консольное приложение". Когда вы запустите проект, вы увидите окно консоли с окном WPF перед ним.

Это выглядит не очень красиво, но я нашел его полезным, поскольку я хотел, чтобы мое приложение запускалось из командной строки с обратной связью там, а затем для определенных параметров команды я бы отображал окно WPF.

Ответ 5

Можно просмотреть выходные данные, предназначенные для консоли, с помощью перенаправление командной строки.

Например:

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

будет записывать все содержимое в файл output.txt.

Ответ 6

Старый пост, но я столкнулся с этим, поэтому, если вы пытаетесь вывести что-то в Output в проекте WPF в Visual Studio, современный метод:

Включите это:

using System.Diagnostics;

И затем:

Debug.WriteLine("something");

Ответ 7

Я использую Console.WriteLine() для использования в окне вывода...

Ответ 9

Насколько я знаю, Console.WriteLine() предназначен только для консольных приложений. Я думаю, что это твоя проблема.