Как VS компилирует консольные приложения, чтобы показать «Нажмите любую клавишу для продолжения»? - PullRequest
9 голосов
/ 09 июля 2009

Когда я разрабатываю консольное приложение C # (которое будет работать на сервере) и запускаю его с помощью Visual Studio, я получаю сообщение «Нажмите любую клавишу для продолжения» до завершения программы.

Однако, когда я компилирую тот же самый файл кода C # вручную, используя CSC, моя программа не показывает это сообщение и завершает работу сразу после завершения своей логики.

Кто-нибудь знает, как я могу сделать такую ​​же функцию при компиляции кода без использования VS и БЕЗ изменения кода C # при любом добавлении ReadLine ()?

ОБНОВЛЕНИЕ: то же сообщение, которое использовалось, когда я изучал C #, я использовал TextPad с CSC, и это сообщение появлялось без добавления вызовов Call (Line) / Read (Line)

Ответы [ 7 ]

22 голосов
/ 09 июля 2009

Это не имеет ничего общего с компилятором - если вы нажимаете F5 для его отладки, а не Ctrl-F5 для запуска без отладки, тогда VS не показывает приглашение. Предположительно это сделано для того, чтобы вы не пропустили какой-либо вывод, который он производит.

Для этого Visual Studio запускает cmd.exe, сообщая ему о запуске исполняемого файла, а затем делает паузу:

"C:\WINDOWS\system32\cmd.exe" /c ""...\ConsoleApplication1.exe"  & pause"

Вероятно, это не происходит при отладке, так как немного сложнее получить идентификатор процесса дочернего процесса дочернего процесса.

Чтобы добавить аналогичную опцию к вашей программе, либо используйте переключатель командной строки, чтобы заставить само приложение приостановить работу, либо используйте пакетный файл для его запуска, затем сделайте паузу, либо используйте ярлык с ними cmd.exe /c.

14 голосов
/ 09 июля 2009

Это невозможно. Запрос на нажатие любой клавиши генерируется Visual Studio при запуске консольного приложения. Это не часть вашей программы.

Единственный способ - использовать Console.Read () в вашем коде

ОБНОВЛЕНИЕ : относительно вашего замечания об использовании TextPad: я не знаком с TextPad, но я не удивлюсь, если TextPad сделал то же самое, что Visual Studio при запуске консольного приложения.

8 голосов
/ 09 июля 2009

Вы могли бы сделать это ...

static void Main(string[] args)
{
#if DEBUG
    Console.Read();
#endif
}

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

7 голосов
/ 09 июля 2009

Вы можете написать пакетный скрипт, который запускает exe для вас и предлагает пользователю нажать клавишу.

Пакетный скрипт будет выглядеть примерно так:

echo off
YourApp.exe
pause
3 голосов
/ 11 марта 2015

Вы можете сделать это, если вы хотите использовать ту же функциональность при отладке.

if (Debugger.IsAttached)
{
    Console.WriteLine("Press any key to continue . . . ");
    Console.ReadKey(true);
}
2 голосов
/ 09 июля 2009

Это поведение не имеет ничего общего с используемым вами компилятором. Когда вы компилируете с Visual Studio, запуск исполняемого файла вне Visual Studio фактически будет работать точно так же, как при компиляции с CSC в командной строке. Visual Studio (и TextPad) добавляет логику для добавления сообщения «Нажмите любую клавишу для продолжения» на консоли.

Если вы хотите, чтобы ваше приложение оставалось открытым, вам нужно будет сделать что-то вроде Console.ReadLine (), чтобы заблокировать выполнение, чтобы ваше приложение не завершило выполнение.

1 голос
/ 09 июля 2009

Вопрос в том, почему вы хотите иметь такое поведение? Функция Нажмите любую клавишу, чтобы продолжить, чтобы вы могли увидеть результаты своего приложения. С другой стороны, если вы строите свой код и запускаете его из командной строки (консоли), он не закроется, когда приложение завершит работу, поэтому вы сможете увидеть вывод.

Как отмечено выше, нажатие любой клавиши для продолжения является функцией IDE и не связано с кодом, который вы пишете. Цель этой функции - позволить вам увидеть вывод вашего консольного приложения.

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