Я недавно хотел сделать это и обнаружил, что не был рад ни одному из ответов здесь.
Если вы последуете совету Марка и установите для типа вывода значение Консольное приложение, возникнут две проблемы:
1) Если вы запустите приложение из Explorer, вы получите раздражающее окно консоли за вашей формой, которое не исчезнет, пока ваша программа не закроется. Мы можем решить эту проблему, вызвав FreeConsole перед отображением графического интерфейса (Application.Run). Раздражает то, что окно консоли все еще появляется. Он немедленно уходит, но, тем не менее, на мгновение.
2) Если вы запускаете его из консоли и отображаете графический интерфейс, консоль блокируется до выхода из графического интерфейса. Это связано с тем, что консоль (cmd.exe) считает, что должна запускать консольные приложения синхронно, а приложения Windows асинхронно (unix-эквивалент «myprocess &»).
Если вы оставите тип вывода как Приложение Windows, но правильно вызовите AttachConsole, вы не получите второе окно консоли при вызове из консоли и не получите ненужную консоль при вызове из Проводника. Правильный способ вызова AttachConsole - передать ему -1. Это заставляет наш процесс подключаться к консоли нашего родительского процесса (окно консоли, которое запустило нас).
Однако у этого есть две разные проблемы:
1) Поскольку консоль запускает приложения Windows в фоновом режиме, она сразу отображает подсказку и разрешает дальнейший ввод. С одной стороны, это хорошая новость: консоль не блокируется в вашем приложении с графическим интерфейсом, но в случае, когда вы хотите вывести вывод на консоль и никогда не показывать графический интерфейс, вывод вашей программы идет после приглашения, и новое приглашение не отображается. отображается, когда вы закончите. Это выглядит немного странно, не говоря уже о том, что ваше «консольное приложение» работает в фоновом режиме, и пользователь может выполнять другие команды во время работы.
2) Перенаправление потока также испорчено, например, «myapp некоторые параметры> somefile» не удается перенаправить. Проблема перенаправления потока требует значительного количества p / Invoke для исправления стандартных дескрипторов, но это решаемо.
После многих часов охоты и экспериментов я пришел к выводу, что не существует способа сделать это идеально. Вы просто не можете получить все преимущества консоли и окна без каких-либо побочных эффектов. Это вопрос выбора того, какие побочные эффекты наименее раздражают для целей вашего приложения.