Чтобы сразу застрять, очень простой пример:
using System;
using System.Windows.Forms;
class test
{
static void Main()
{
Console.WriteLine("test");
MessageBox.Show("test");
}
}
Если я скомпилирую это с параметрами по умолчанию (используя csc в командной строке), как и ожидалось, он скомпилируется в консольное приложение. Кроме того, потому что я импортировалSystem.Windows.Forms
, он также покажет окно сообщения.
Теперь, если я воспользуюсь опцией /target:winexe
, которая, как мне кажется, аналогична выбору Windows Application
из опций проекта, как и ожидалось, я увижу только окно сообщения и не буду выводить данные в консоль.
(Фактически, в тот момент, когда он запускается из командной строки, я могу выполнить следующую команду еще до того, как приложение будет завершено).
Итак, мой вопрос - я знаю, что вы можете получать "окна" / формы вывода из консольного приложения, но есть ли способ показать консоль из приложения Windows?
Ответы:
этот должен работать.
источник
>
для перенаправления вывода я получаю отдельное окно консоли и нулевой вывод в моем файле.Возможно, это слишком упрощенно ...
Создать проект Windows Form ...
Затем: Свойства проекта -> Приложение -> Тип вывода -> Консольное приложение.
Затем можно запустить консоль и формы вместе, работает для меня
источник
>
. Однако я надеялся на решение, которое объяснило бы, как работать в качестве «Консольного приложения» только в некоторых случаях (то есть программно включить все, что происходит при изменении этого таинственного параметра Visual Studio). Кто-нибудь знает, как это работает под капотом?Если вы не беспокоитесь об открытии консоли по команде, вы можете войти в свойства своего проекта и изменить его на Консольное приложение.
,
Это по-прежнему покажет вашу форму, а также появится окно консоли. Вы не можете закрыть окно консоли, но оно работает как отличный временный регистратор для отладки.
Просто не забудьте выключить его перед развертыванием программы.
источник
Вы можете вызвать
AttachConsole
с помощью pinvoke, чтобы прикрепить окно консоли к проекту WinForms: http://www.csharp411.com/console-output-from-winforms-application/Вы также можете использовать Log4net ( http://logging.apache.org/log4net/index.html ) для настройки вывода журнала в различных конфигурациях.
источник
Это сработало для меня, чтобы передать вывод в файл. Вызовите консоль с помощью
Добавьте этот код в свое приложение.
Я нашел этот код здесь: http://www.csharp411.com/console-output-from-winforms-application/ Я подумал, что стоит разместить его и здесь.
источник
AttachConsole(ATTACH_PARENT_PROCESS)
я получаю вывод консоли, но перенаправление его в командной строке с помощью>
не работает. Когда я пробую этот ответ, я не могу получить никаких результатов ни в консоли, ни в файле.По сути, здесь могут произойти две вещи.
Вывод в консоль. Программа winforms может присоединиться к окну консоли, в котором она была создана (или к другому окну консоли, или даже к новому окну консоли, если необходимо). После подключения к окну консоли Console.WriteLine () и т.д. работает должным образом. Один из подводных камней этого подхода заключается в том, что программа немедленно возвращает управление окну консоли, а затем продолжает запись в него, поэтому пользователь может также вводить текст в окне консоли. Я думаю, вы можете использовать start с параметром / wait, чтобы справиться с этим.
Ссылка для запуска Синтаксиса команды
Перенаправленный вывод консоли Это когда кто-то передает вывод вашей программы куда-то еще, например.
yourapp> file.txt
При прикреплении к окну консоли в этом случае фактически игнорируется трубопровод. Чтобы выполнить эту работу, вы можете вызвать Console.OpenStandardOutput (), чтобы получить дескриптор потока, в который должен быть передан вывод. Это работает только в том случае, если вывод передается по конвейеру, поэтому, если вы хотите обрабатывать оба сценария, вам нужно открыть стандартный вывод, записать в него и присоединиться к окну консоли. Это означает, что вывод отправляется в окно консоли и в канал, но это лучшее решение, которое я мог найти. Ниже кода, который я использую для этого.
источник
Console.WriteLine
чтобы вместо этого вызывать новый,WriteLine
определенный выше. Несмотря на то, что я пытался это сделать, я не смог с помощью этого кода перенаправить что-либо в файл при запуске приложения в командной строке и перенаправлении с>
помощью в файл.Console.WriteLine
- это просто хорошая практика, поскольку она позволяет вам тестировать и легко менять места, в которые вы входите (например, вы можете начать регистрацию в облачной службе ведения журнала, такой как PaperTrail или что-то еще. )StreamWriter _stdOutWriter;
Создайте приложение Windows Forms и измените тип вывода на консоль.
Это приведет к открытию и консоли, и формы .
источник
источник
источник
StandardHandle : uint
здесь не так ... должен быть IntPtr для работы как на x86, так и на x64Вы можете в любой момент переключаться между типами приложений, консолью или окнами. Итак, вы не будете писать специальной логики для просмотра stdout. Кроме того, при запуске приложения в отладчике вы увидите весь стандартный вывод в окне вывода. Вы также можете просто добавить точку останова, а в свойствах точки останова изменить "When Hit ...", вы можете выводить любые сообщения и переменные. Также вы можете поставить / снять отметку с «Продолжить выполнение», и ваша точка останова станет квадратной. Таким образом, сообщения точки останова ничего не меняют в приложении в окне вывода отладки.
источник
Почему бы просто не оставить его как приложение Window Forms и создать простую форму, имитирующую консоль. Форму можно сделать так, чтобы она выглядела так же, как консоль с черным экраном, и чтобы она реагировала непосредственно на нажатие клавиш. Затем в файле program.cs вы решаете, нужно ли вам запускать основную форму или ConsoleForm. Например, я использую этот подход для записи аргументов командной строки в файл program.cs. Я создаю ConsoleForm, сначала скрываю ее, а затем передаю строки командной строки функции AddCommand в ней, которая отображает разрешенные команды. Наконец, если пользователь указал -h или -? , я вызываю .Show в ConsoleForm, и когда пользователь нажимает на нем любую клавишу, я закрываю программу. Если пользователь не дает -? Я закрываю скрытую ConsoleForm и запускаю основную форму.
источник