Разница между консольными и winforms приложениями при запуске из cmd - PullRequest
4 голосов
/ 30 сентября 2011

У меня есть приложение winforms, которое иногда используется из командной строки.Вот код (упрощенно, конечно):

[STAThread]
static void Main()
{
    AttachConsole(ATTACH_PARENT_PROCESS);
    Console.WriteLine("Hello");

    /*Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());*/
}

Если бы это было консольное приложение, то вывод мог бы быть:

C:\ConsoleApplication\ConsoleApplication.exe
Hello
C:\ConsoleApplication\_

В случае приложения Windows это фактически:

C:\WindowsApplication\WindowsApplication.exe
C:\WindowsApplication\Hello
_

Может кто-нибудь сказать мне, почему у нас такая разница, и возможно ли заставить мое приложение Windows работать как консоль при запуске из cmd?

edit:

Я хочу, чтобы мое приложение Windows работало как консоль при запуске из cmd:

C:\WindowsApplication\WindowsApplication.exe
Hello
C:\WindowsApplication\_

решение:

В результате я запускаю свое приложениекак

C:\WindowsApplication\start /wait WindowsApplication.exe

Ответы [ 3 ]

9 голосов
/ 30 сентября 2011

Да.Разница в том, что cmd.exe знает о типе исполняемого файла.Он знает, как ждать завершения процесса, когда это приложение в режиме консоли. не ждет, когда это обычное графическое приложение Windows.Полагая, что он создаст свое собственное окно.Таким образом, он снова отображает командную строку, ваш вывод добавляется к этому.У вас также могут возникнуть проблемы с использованием Console.ReadLine() btw.

Вам придется запустить программу с start /wait yourapp.exe, чтобы заставить cmd.exe ждать.Вызов AllocConsole() - единственное универсальное решение.Также заботится о создании консоли, когда ваше приложение запускается с помощью ярлыка.

AllocConsole () довольно дезориентирует.Подумайте о том, чтобы написать крошечное приложение в режиме консоли, которое не выполняет ничего, кроме Process.Start + WaitForExit, чтобы запустить основную программу.Возможно также манипулирование аргументами командной строки.Теперь вы получаете блокирующее поведение обратно.Если вы переименуете исполняемый файл в mainapp.com (для запуска mainapp.exe), то разница будет скрыта довольно хорошо, уловка, которую использует VS (devenv.exe против devenv.com).

4 голосов
/ 30 сентября 2011

В exe есть флаг, указывающий, является ли это консольным приложением или графическим приложением (winform в вашем случае).Когда вы запускаете приложение, Windows отсоединяет консоль от программы, если это консольное приложение.Вы можете использовать следующий подход для достижения того, что вы хотите:

  1. Скомпилируйте приложение как графический интерфейс, назовите его mytool.exe
  2. Создайте псевдоним doskey mytool = start / wait c: \путь \ mytool.exe $ *

Таким образом, когда вы запускаете mytool.exe в проводнике или ярлыке, вы запускаете обычное приложение Windows;когда вы набираете mytool в консоли, вы фактически запускаете его с помощью «start / wait», что не отсоединит консоль, если не учитывать флаг.(Однако вам необходимо подключиться к родительской консоли в вашем приложении, если вы хотите что-то выводить / вводить с консоли.

0 голосов
/ 30 сентября 2011

Вы хотите, чтобы приложение Windows блокировало поток консоли, пока он работает, если я вас правильно понимаю.Я понятия не имею, зачем вам это делать, но я могу дать представление о том, как это может работать:

Измените приложение WinForms на консольное приложение, которое открывает форму.Таким образом, он будет блокировать поток консоли при отображении окна.

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