Console.Writeline () не работает - PullRequest
       47

Console.Writeline () не работает

6 голосов
/ 06 августа 2009

Я создаю проект c # winforms, который может быть запущен как графический интерфейс или работать из командной строки. В настоящее время я могу обрабатывать ввод и аргументы командной строки. Я могу запустить программу из командной строки, и я могу использовать программу для обработки аргументов. Но Console.Writeline () абсолютно ничего не делает. Любая подсказка, почему это может быть?

Ответы [ 7 ]

6 голосов
/ 06 марта 2013

Вы можете включить консоль в приложении Windows Form, используя следующие DllImports:

    [DllImport("kernel32.dll")]
    static extern bool AttachConsole(int dwProcessId);
    private const int ATTACH_PARENT_PROCESS = -1;

    [DllImport("kernel32.dll", SetLastError = true)]
    internal static extern int FreeConsole();

Затем вы можете включить консоль, используя:

    AttachConsole(ATTACH_PARENT_PROCESS);

И вы можете отключить его, используя:

     FreeConsole();
6 голосов
/ 06 августа 2009

По большей части см. ответ здесь . Однако я хотел бы отметить существование API-вызова FreeConsole(), который позволяет вам изящно закрыть консоль.

[DllImport("kernel32.dll")]
static extern int FreeConsole() 

Я хотел бы отметить одну вещь: вы можете увидеть некоторую странность командной строки, появляющейся перед выходом консоли, если вы запускаете ее с существующей консоли и подключаетесь к ней с помощью AttachConsole (в отличие от AllocConsole).

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

В ответ на ваш комментарий : это либо AttachConsole , либо AllocConsole. Приведенный мною пример сначала пытается присоединиться к существующей консоли. Если это не удается (скорее всего потому, что он не существует), вместо этого создается новое окно консоли.

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

Кстати: если вы планируете использовать pipe в командной строке (например, перенаправить вывод в файл), это, к сожалению, не будет работать.

4 голосов
/ 06 августа 2009

Это потому, что вы написали приложение winforms - это означает, что System.Console.Out (т.е. стандартный поток вывода) установлен на Stream.Null. Это означает, что любые вызовы в этот поток будут молча терпеть неудачу.

Вы можете обрабатывать ввод из командной строки, потому что он поступает из другого потока. Мораль этой истории в том, что у вас может быть приложение winforms или приложение командной строки, но не оба одновременно.

2 голосов
/ 19 августа 2013

Я сделал это в фоновом потоке, который запускает функцию из динамически загружаемой DLL (отражение)

AllocConsole();
IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE);

StreamWriter standardOutput = new StreamWriter(Console.OpenStandardOutput());
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);
//
//Console writing here
//
FreeConsole();

Моя консоль была пустой, пока я не добавил Console.SetOut (), я не уверен, что вам нужно вызывать GetStdHandle ()

1 голос
/ 17 сентября 2013

Возможно, вам потребуется изменить тип приложения. Это можно сделать, либо изменив его через Свойства приложения в графическом интерфейсе (как описано в ответ из ConsultUtah), либо вы можете отредактировать файл .csproj :

Winform / WPF:

<OutputType>WinExe</OutputType>

Консоль ( это то, что вам нужно для работы console.writeline() ):

<OutputType>Exe</OutputType>

Dll (включая веб-приложения):

<OutputType>Library</OutputType>
0 голосов
/ 06 августа 2009

Для работы функции консоли проект должен быть настроен на компиляцию в консольное приложение. С другой стороны, у него всегда будет консольное окно, даже если оно запускается как GUI. Я не знаю обходного пути для этого (но было бы интересно услышать об этом, если таковой имеется).

0 голосов
/ 06 августа 2009

Это связано с типом проекта, поскольку вы настраиваете его на вкладке приложения в свойствах проекта, у вас есть 3 варианта:

  • Консольное приложение
  • Win приложение
  • Библиотека классов

Однако, если вы работаете с Win Application, вы также можете обрабатывать аргументы командной строки, поскольку они принимаются функцией Main.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...