Как VS компилирует консольные приложения для показа "Нажмите любую клавишу, чтобы продолжить"?

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

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

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

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

Ответ 1

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

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

echo off
YourApp.exe
pause

Ответ 2

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

Для этого Visual Studio запускает cmd.exe, говоря ей, чтобы запустить исполняемый файл, а затем приостановить:

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

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

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

Ответ 3

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

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

UPDATE: относительно вашего замечания об использовании TextPad: я не знаком с TextPad, но я не удивлюсь, если TextPad выполнил то же, что и Visual Studio при запуске консольного приложения.

Ответ 4

Вы можете сделать это...

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

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

Ответ 5

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

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

Ответ 6

Это можно сделать, если вы хотите иметь такую ​​же функциональность при отладке.

if (Debugger.IsAttached)
{
    Console.WriteLine("Press any key to continue . . .");
    Console.ReadKey(true);
}

Ответ 7

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

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