Как указать код завершения консольного приложения в .NET? - PullRequest
438 голосов
/ 01 октября 2008

У меня есть тривиальное консольное приложение в .NET. Это всего лишь тестовая часть более крупного приложения. Я хотел бы указать «код выхода» моего консольного приложения. Как мне это сделать?

Ответы [ 12 ]

549 голосов
/ 01 октября 2008

3 варианта:

  • Вы можете вернуть его из Main, если объявите свой Main метод для возврата int.
  • Вы можете позвонить Environment.Exit(code).
  • Вы можете установить код выхода, используя свойства: Environment.ExitCode = -1;. Это будет использоваться, если ничто другое не устанавливает код возврата или использует одну из других опций выше).

В зависимости от вашего приложения (консоли, службы, веб-приложения и т. Д.) Могут использоваться разные методы.

254 голосов
/ 01 октября 2008

В дополнение к ответам, охватывающим возвращение int's ... призыв к здравомыслию. Пожалуйста, укажите ваши коды выхода в перечислении, с флагами, если это необходимо. Это значительно облегчает отладку и обслуживание (и в качестве бонуса вы можете легко распечатать коды выхода на экране справки - у вас есть один из них, верно?).

enum ExitCode : int {
  Success = 0,
  InvalidLogin = 1,
  InvalidFilename = 2,
  UnknownError = 10
}

int Main(string[] args) {
   return (int)ExitCode.Success;
}
46 голосов
/ 27 августа 2012

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

  1. Измените метод Main в вашем приложении, чтобы он возвращал int вместо void (функция, которая возвращает Integer вместо Sub в VB.Net), а затем возвращает код выхода из этого метода.
  2. Установите для свойства Environment.ExitCode код выхода. Обратите внимание, что метод 1. имеет преимущество - если метод Main возвращает что-либо отличное от void (это Sub в VB.Net), тогда значение этого свойства будет игнорироваться.
  3. Передайте код завершения методу Environment.Exit . Это немедленно прервет процесс, в отличие от двух других методов.

Важным стандартом, который следует соблюдать, является то, что 0 представляет «Успех».

В связанной теме рассмотрите возможность использования перечисления для определения кодов выхода, которые ваше приложение будет возвращать. Атрибут Flags позволит вам вернуть комбинацию кодов.

Также убедитесь, что ваше приложение скомпилировано как «Консольное приложение».

43 голосов
/ 22 ноября 2011

Если вы собираетесь использовать метод, предложенный Дэвидом, вам также следует взглянуть на атрибут [Flags].

Это позволяет вам выполнять побитовые операции над перечислениями.

[Flags]
enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}

Тогда

(ExitCodes.SignFailed | ExitCodes.UnknownError)

будет 16 + 32.:)

25 голосов
/ 01 октября 2008
24 голосов
/ 01 октября 2008
int code = 2;
Environment.Exit( code );
11 голосов
/ 01 октября 2008

Используйте ExitCode, если ваш main имеет подпись возврата void, в противном случае вам нужно «установить» его на возвращаемое вами значение.

Environment.ExitCode Свойство

Если метод Main возвращает void, вы можете использовать это свойство для установки кода выхода, который будет возвращен вызывающей среде. Если Main не возвращает void, это свойство игнорируется. Начальное значение этого свойства равно нулю.

11 голосов
/ 01 октября 2008

Просто верните соответствующий код с основного.

int main(string[] args)
{
      return 0; //or exit code of your choice
}
8 голосов
/ 11 октября 2016

Как обновление ответа Скотта Манро :

  • В C # 6.0 и VB.NET 14.0 (VS 2015) либо Environment.ExitCode , либо Environment.Exit (exitCode) требуется для возврата ненулевого кода из консольное приложение. Изменение типа возврата Main не имеет никакого эффекта.
  • В F # 4.0 (VS 2015) возвращаемое значение точки входа main соблюдается.
7 голосов
/ 22 ноября 2011

Опция перечисления превосходна, однако ее можно улучшить, умножив числа следующим образом:

enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}

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

Например, уровень ошибки 6 может состоять только из ошибок 4 и 2, 12 может состоять только из ошибок 4 и 8, 14 может состоять только из 2, 4 и 8 и т. Д.

...