Як вказати код виходу програми консолі в .NET?


471

У мене є тривіальна консольна програма у .NET. Це просто тестова частина більшого додатка. Я хотів би вказати "код виходу" моєї консольної програми. Як це зробити?

Відповіді:


599

3 варіанти:

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

Залежно від вашої програми (консоль, сервіс, веб-додаток тощо) можна використовувати різні методи.


12
Для тих, хто цікавиться, чому це не працює в їхньому випадку, переконайтеся, що ваш проект складено як "консольна програма", а не як "додаток Windows".
Марсель Госселін

9
що робити, якщо у мене є додаток WinForms, що з деякими аргументами я хочу, щоб він поводився як консольний додаток?
sebagomez

5
Ви також можете просто ввести мейн-програму як int (замінити void на int) і використовувати, наприклад, "return -1;" повернутися з основної програми. Це більш портативно, ніж Environment.Exit () (що залежить від навколишнього середовища).
Вернер

14
@DannyBeckett За умовою, вихідний код 0означає успіх, а ненульовий - означає збій. return;вказує на успіх через код виходу 0та return -1;вказує на невдачу.
allonhadaya

6
Ви також можете встановити код виходу за допомогою властивостей: Environment.ExitCode = -1;
t3b4n

270

На додаток до відповідей, що стосуються повернення закордонного ... прохання про розумність. Будь-ласка, будь-ласка, визначте свої вихідні коди в перерахунку, якщо вони потрібні. Це налагоджує налагодження та обслуговування набагато простіше (і, як бонус, ви можете легко роздрукувати вихідні коди на екрані довідки - у вас є один із них, правда?).

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

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

46
Ви можете додати, що значення "0" для "Успіху" не випадково, а фактично "стандартне" значення для даної ситуації.
Крістіан.К

39
ЦЕЙ. Ось чому SO - це найбільший веб-сайт в історії Інтернету. Ця порада є недоступною в жодному підручнику, і її можна отримати лише спілкуючись із досвідченим професіоналом. ДЯКУЮ ТОБІ.
Даніель Сабо

17
Ви кажете, що 0 - це стандартне значення для успіху, і все ж при перетворенні 0/1 в булеве значення 0 - помилкове, а 1 - істинне! Може бути більш точним сказати, що код виходу 0 означає «відсутність помилки», а не «успіх», оскільки вихідний код - це ErrorResult, а не просто результат.
Марк Шапіро

11
Повний перелік конвенцій про microsoft див . У розділі msdn.microsoft.com/en-us/library/windows/desktop/… . Деякий хлопець склав величезний перелік конкурсів і використав його в корпусі комутатора в коментарях нижче.
nawfal

5
@MarkShapiro, я думаю, 0 = Successвипливає з того, що потрібен лише один код успіху, але багато кодів помилок, таких як 0, як немає + або - у цілих комп’ютерних цілях, можна використовувати для унікального визначення успіху
Себастьян

49

Існує три методи, які можна використовувати для повернення коду виходу з консольного додатка.

  1. Змініть Mainметод у вашій програмі так, щоб він повертав intзамість void(функцію, яка повертає Integerзамість SubVB.Net), а потім повертав вихідний код із цього методу.
  2. Встановіть для коду виходу властивість Environment.ExitCode . Зауважте, що метод 1. має перевагу - якщо Mainметод повертає щось інше, ніж voidSubв VB.Net), значення цього властивості буде ігноруватися.
  3. Передайте код виходу методу Environment.Exit . Це негайно припинить процес на відміну від двох інших методів.

Важливим стандартом, якого слід дотримуватися, є те, що 0являє собою «Успіх».

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

Також переконайтеся, що ваша програма складена як "Консольна програма".


1
Це викликає цікавий момент. Налаштування Environment.ExitCodeне закриває програму відразу, але Environment.Exitметод негайно закриває програму
PsychoData

1
Вихідний код також працює у програмах Windows. Якщо додаток буде запущено з c #, через Processоб’єкт, ви можете попросити об’єкт WaitForExit(), а потім попросити код виходу з нього.
Nyerguds

43

Якщо ви збираєтесь використовувати метод, запропонований Девідом, вам слід також ознайомитись з атрибутом [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. :)


3
Це означає, що програма скаже «Ваш пароль неправильний», тоді перейдіть, щоб спробувати підписати все, що він підписує, і зупиняйтеся лише у тому випадку, коли він не вдасться. Ви повинні повернутися, як тільки не вдалося; все інше є попередженням, і програма все одно має повернути 0.
Піт Кіркхем,

3
Маловідомий факт полягає в тому, що [Прапори] нічого не робить, щоб увімкнути або вимкнути побітові операції. Все, що він робить, - це переосмислити метод ToString, щоб результат відображав побітові прапори. З ним або без нього, ви все ще можете робити побітові операції.
Стівен

3
@Steven, що приємно знати, але я все-таки рекомендую прикрашати переписки, призначені для "використання прапора", з цим атрибутом, якщо нічого іншого це не передає наміру.
MarioDS



11

Просто поверніть відповідний код з основного.

int main(string[] args)
{
      return 0; //or exit code of your choice
}

2
Додаток консолі C # за замовчуванням взагалі не оголошує основним. Це оголошує static void Main(string[] args);
Марк Лаката

19
@Mark Lakta: Тоді змінити, ні?
Естебан Арая

11

Використовуйте ExitCode, якщо ваш основний має недійсний зворотний підпис, інакше вам потрібно «встановити» його за значенням, яке ви повернете.

Властивість Environment.ExitCode

Якщо метод Main повернеться недійсним, ви можете використовувати це властивість для встановлення коду виходу, який буде повернуто в середовище виклику. Якщо Main не повертає недійсних, це властивість ігнорується. Початкове значення цього властивості дорівнює нулю.


8

В якості оновлення для Скотта Манро відповіді :

  • У C # 6.0 та VB.NET 14.0 (VS 2015) для повернення ненульового коду з консольного додатка необхідне або Environment.ExitCode, або Environment.Exit (exitCode) . Зміна типу поверненняMain не впливає.
  • У F # 4.0 (VS 2015) враховується повернене значення mainточки введення.

Чи можна перевірити ваш перший пункт щодо C # 6? Я не можу знайти щось в Інтернеті. Повернене значення від функції Main приєднується до коду виходу процесу (принаймні, у всіх попередніх компіляторах), чому вони повинні були це змінити?
Арман Макгітарін

Чисті анекдотичні докази, але я просто зіткнувся з цим у своїй власній бібліотеці, де просто повернення коду результату / помилки Main()не встановило так, Process.ExitCodeяк це бачило викликає додаток.
Маркус Мангельсдорф

MSDN претензії int Mainвсе ще можуть бути використані як альтернатива Environment.ExitCode. посилання
Арман Макгітарій

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

7

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

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


2
Тобто, якщо ви намагаєтеся перевірити на наявність подальших помилок після того, як зіткнулися з такою. Більшість додатків не мають.
Nyerguds

3

Мої 2 копійки:

Коди помилок системи можна знайти тут: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

Ви знайдете типові коди типу 2 для "файл не знайдений" або 5 для "відмовлено у доступі".

І коли ви натрапите на невідомий код, ви можете скористатися цією командою, щоб дізнатися, що це означає:

net helpmsg decimal_code

напр

чиста довідка1

повертає

Неправильна функція


0

Використовуйте цей код

Environment.Exit(0);

використовувати 0 як int, якщо ви нічого не хочете повернути.


Це не відповідає на питання ОП, а повернення 0 повертає щось ...
PL
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.