2009-07-09 2 views
9

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

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

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

UPDATE: То же самое сообщение, используемое, чтобы появиться, когда я узнал, C#, я имел обыкновение использовать TextPad с CSC, и это сообщение, используемое появляться без добавления каких-либо записи (Line)/Read (Line) созывов

+0

Эта [ссылка] (http://stackoverflow.com/q/4834914/944628) работает для меня с помощью клавиш Ctrl + F5. Я использую Visual Studio 2010. – leonardo

ответ

7

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

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

echo off 
YourApp.exe 
pause 
+0

Спасибо, TextPad автоматически создает пакетные файлы. –

+2

Вместо этого я предложил бы ответ Халки. –

14

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

Единственный способ заключается в использовании Console.Read() в коде

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

+0

вы можете добавить строку Console.Read() и прокомментировать ее при доставке. Однако наилучшим подходом, который я знаю, является использование журнала и регистрация всей необходимой информации на более низком уровне, такой как Info или Trace или Debug, и ее удаление при отправке :-) –

+0

См. Мое обновление выше. –

+0

ОК, спасибо. Что касается вашего обновления, как я упоминал в своем комментарии к ответу Андрея, TextPad автоматически создает пакетные файлы для этого. –

2

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

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

22

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

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

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

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

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

8

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

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

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

+0

Naoooo, это вызовет зависание, если кто-то не подумает добавить какой-то входной канал, прежде чем запускать скрипт. например 'echo y | script.exe', чтобы сохранять гибкость, гораздо лучше сохранить паузу вне программы. –

1

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

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

2

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

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

, который не учитывает ни c14n, ни i11n. –

+0

Невозможно выполнить i11n на этом, поскольку строки ресурсов, используемые Visual Studio, недоступны. Я действительно не уверен, что вы имеете в виду с c14n, это не похоже на заданный вопрос. – Siewers

+0

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

Смежные вопросы