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

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

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

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

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

90 голосов | спросил Rob 2 +04002008-10-02T06:12:03+04:00312008bEurope/MoscowThu, 02 Oct 2008 06:12:03 +0400 2008, 06:12:03

8 ответов


0

Вам нужно будет вручную создать окно консоли, прежде чем вы вызовете какие-либо методы Console.Write. Это заставит Консоль работать должным образом без изменения типа проекта (который для приложения 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);
    }
} 
ответил John Leidegren 5 AMpSun, 05 Apr 2009 11:14:31 +040014Sunday 2009, 11:14:31
0

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

ответил Brian 2 +04002008-10-02T06:17:12+04:00312008bEurope/MoscowThu, 02 Oct 2008 06:17:12 +0400 2008, 06:17:12
0

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

Trace.WriteLine("text");

Это выведет в окно «Вывод» в Visual Studio (при отладке).

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

using System.Diagnostics;
ответил Phobis 2 +04002008-10-02T06:20:35+04:00312008bEurope/MoscowThu, 02 Oct 2008 06:20:35 +0400 2008, 06:20:35
0

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

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

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

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

ответил 27 PMpMon, 27 Apr 2009 15:52:01 +040052Monday 2009, 15:52:01
0

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

Например:

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

запишет все содержимое в файл output.txt.

ответил Lu55 30 Maypm14 2014, 19:10:06
0

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

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

using System.Diagnostics;

А потом:

Debug.WriteLine("something");
ответил Smitty 19 Jam1000000amThu, 19 Jan 2017 05:07:11 +030017 2017, 05:07:11
0

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

ответил erodewald 2 +04002008-10-02T09:50:56+04:00312008bEurope/MoscowThu, 02 Oct 2008 09:50:56 +0400 2008, 09:50:56
0

Ознакомьтесь с этим постом, это было очень полезно для меня. Загрузите пример кода:

http://www.codeproject.com/Статьи /335909 /Встраивание-а-консоль-в-Ac-приложений

ответил Sam Wright 12 AM00000070000002731 2014, 07:08:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132