Как указать код выхода консольного приложения в .NET?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
493
0
330 247
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

int code = 2;
Environment.Exit( code );

Любая техническая причина, по которой вы просто не написали «Environment.Exit (2);» ?

Blorgbeard 01.10.2008 03:57

Присвоение магического числа переменной с бессмысленным именем не делает ее менее магической.

Blorgbeard 13.10.2015 23:37

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

int Main(string[] args)
{
      return 0; //or exit code of your choice
}
Ответ принят как подходящий

3 варианта:

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

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

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

Marcel Gosselin 07.04.2012 08:11

что, если у меня есть приложение WinForms, которое с некоторыми аргументами я хочу, чтобы оно работало как консольное приложение?

sebagomez 07.09.2012 20:27

Вы также можете просто ввести программу main как int (заменить void на int) и использовать, например, "возврат -1;" чтобы вернуться из основной программы. Это более переносимо, чем Environment.Exit () (который зависит от среды).

werner 06.06.2013 15:27

Нет необходимости изменять тип возвращаемого значения Main с void на int; просто используйте return; вместо return -1;

Danny Beckett 03.10.2013 07:19

@DannyBeckett По соглашению, код выхода 0 означает успех, а ненулевое значение означает неудачу. return; указывает на успех через код выхода 0, а return -1; указывает на сбой.

allonhadaya 20.11.2013 19:42

Вы также можете установить код выхода, используя свойства: Environment.ExitCode = -1;

t3b4n 31.08.2016 22:10

@ marcel-gosselin Работает даже как «Приложение Windows», но когда вы ждете завершения процесса. В случае использования кода возврата из приложения Windows в пакетном сценарии Windows -> измените вызов с «myApp.exe» на «start / wait myApp.exe», а затем проверьте% errorlevel%. Это помогло мне :)

badsamaritan 13.09.2016 20:36

Обратите внимание на ответ ниже @Vern DeHaven: простое возвращение int приведет к тому, что нет больше будет работать в C# 6.0 / Visual Studio 2015. (Сам наткнулся на это - очень запутанно!)

Marcus Mangelsdorf 01.12.2016 17:01

Документация MSDN имеет отличный пример, включая использование примера в пакетном файле.

user3613932 27.07.2017 05:41

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

Свойство Environment.ExitCode

If the Main method returns void, you can use this property to set the exit code that will be returned to the calling environment. If Main does not return void, this property is ignored. The initial value of this property is zero.

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

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

int Main(string[] args) {
   return (int)ExitCode.Success;
}

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

Christian.K 01.10.2008 09:36

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

AndyM 07.08.2009 14:47

Вы говорите, что 0 - стандартное значение для успеха, и все же при преобразовании 0/1 в логическое значение 0 - ложь, а 1 - истина! Возможно, будет более точным сказать, что код выхода 0 означает «отсутствие ошибки», а не «успех», поскольку код выхода - это ErrorResult, а не просто результат.

Mark Shapiro 20.10.2012 05:08

Полный список соглашений Microsoft см. В разделе msdn.microsoft.com/en-us/library/windows/desktop/…. Какой-то парень составил огромный список констант и использовал его в случае переключения в комментариях ниже.

nawfal 10.01.2014 14:27

@MarkShapiro, я думаю, 0 = Success исходит из того факта, что требуется только один код успеха, но многие коды ошибок, такие как 0, как отсутствие + или - в компьютерных целых числах, могут использоваться для однозначной идентификации успеха

Sebastian 11.03.2014 16:54

: int вроде не нужен, в любом случае гипс нужен.

Polluks 18.07.2018 11:36

@MarkShapiro Можно было бы рассматривать это как код выхода, указывающий на то, завершилась ли программа ненормально (и если да, то каким образом). В этом случае false, являющийся стандартным возвращаемым значением для нормального завершения, имеет смысл (и, что более важно, упрощает использование парадигмы if (exit code) { handle error; }).

Justin Time - Reinstate Monica 23.08.2018 02:44

Здесь могут быть интересны документы glibc о статусе выхода. Эти значения определены в stdlib.h: gnu.org/software/libc/manual/html_node/Exit-Status.html

Per Lundberg 09.01.2021 14:02

Вариант перечисления превосходен, однако его можно улучшить, умножив числа, как в:

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 и т. д.

Это если вы потрудитесь проверить наличие дальнейших ошибок после того, как столкнетесь с одной из них. Большинство приложений этого не делают.

Nyerguds 29.04.2014 14:59

Если вы собираетесь использовать метод, предложенный Дэвидом, вам также следует взглянуть на атрибут [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. :)

Это означает, что программа скажет «ваш пароль неправильный», а затем попытается подписать все, что она подписывает, и остановится только в случае сбоя. Вы должны вернуться, если потерпели неудачу; все остальное является предупреждением, и программа все равно должна возвращать 0.

Pete Kirkham 02.09.2015 10:47

Малоизвестный факт заключается в том, что [Flags] ничего не делает для включения или отключения побитовых операций. Все, что он делает, - это переопределяет метод ToString, чтобы выходные данные представляли побитовые флаги. С ним или без него вы все равно можете выполнять побитовые операции.

Steven 03.08.2016 21:26

@Steven, это приятно знать, но я все же рекомендую украшать перечисления, предназначенные для «использования флага», этим атрибутом, если ничто другое не передает намерения.

MarioDS 07.11.2017 13:29

Есть три метода, которые можно использовать для возврата кода выхода из консольного приложения.

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

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

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

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

Это поднимает интересный момент. Установка Environment.ExitCode не закрывает программу немедленно, но метод Environment.Exit закрывает программу немедленно.

PsychoData 18.04.2014 20:41

Код выхода также работает в приложениях Windows. Если приложение будет запущено из C# через объект Process, вы можете запросить у объекта WaitForExit(), а затем запросить у него код выхода.

Nyerguds 29.04.2014 14:56

Мои 2 цента:

Здесь вы можете найти коды системных ошибок: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

Вы найдете типичные коды, такие как 2 для «файл не найден» или 5 для «отказано в доступе».

И когда вы наткнетесь на неизвестный код, вы можете использовать эту команду, чтобы узнать, что он означает:

net helpmsg decimal_code

например

net helpmsg 1

возвращается

Incorrect function

В качестве обновления отвечать Скотта Манро:

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

Можно ли проверить ваш 1-й пункт относительно C# 6? Кажется, я ничего не могу найти в Интернете. Возвращаемое значение из функции Main прикрепляется к коду выхода процесса (по крайней мере, во всех предыдущих компиляторах), почему они должны были это изменить?

Arman 27.10.2016 15:02

Чистое анекдотическое свидетельство, но я только что столкнулся с этим в своей собственной библиотеке, где простой возврат моего кода результата / ошибки из Main() не устанавливал Process.ExitCode в том виде, в каком его видит вызывающее приложение.

Marcus Mangelsdorf 01.12.2016 16:59

MSDN утверждает, что int Main по-прежнему можно использовать в качестве альтернативы Environment.ExitCode. связь

Arman 02.12.2016 19:28

У меня есть приложение, которое запускает несколько потоков. В определенных обстоятельствах мне нужно перекрыть некоторые потоки с помощью Thread.Abort () перед выходом из приложения. В этих обстоятельствах int Main () {... thread.Abort (); ... return 0;} НЕ приводит к тому, что код выхода процесса равен 0: код выхода процесса равен -1. Похоже, что в определенных обстоятельствах MS решила, что соглашение об использовании возвращаемого значения основного потока для установки кода выхода процесса для них недостаточно. Честно говоря, это может быть проблема с синхронизацией: прерывание потока может устанавливать код выхода очень поздно в игре.

David I. McIntosh 13.12.2016 20:25

Используйте этот код

Environment.Exit(0);

используйте 0 как int, если вы не хотите ничего возвращать.

Это не ответ на вопрос OP, и возвращение 0 что-то возвращает ...

P-L 09.01.2020 16:30

он возвращает то, что обычно возвращает приложение. Если вы не укажете его, приложение вернет 0

John Lord 03.08.2020 17:58

Просто другой способ:

public static class ApplicationExitCodes
{
    public static readonly int Failure = 1;
    public static readonly int Success = 0;
}

Другие вопросы по теме