




int code = 2;
Environment.Exit( code );
Присвоение магического числа переменной с бессмысленным именем не делает ее менее магической.
System.Environment.ExitCode
http://msdn.microsoft.com/en-us/library/system.environment.exitcode.aspx
Просто верните соответствующий код из main.
int Main(string[] args)
{
return 0; //or exit code of your choice
}
3 варианта:
Main, если вы объявите свой метод Main для возврата int.Environment.Exit(code).Environment.ExitCode = -1;. Это будет использоваться, если ничто другое не устанавливает код возврата или использует один из других параметров, указанных выше).В зависимости от вашего приложения (консоль, служба, веб-приложение и т. д.) Могут использоваться разные методы.
Тем из вас, кто задается вопросом, почему это не работает в их случае, убедитесь, что ваш проект скомпилирован как «консольное приложение», а не как «приложение Windows».
что, если у меня есть приложение WinForms, которое с некоторыми аргументами я хочу, чтобы оно работало как консольное приложение?
Вы также можете просто ввести программу main как int (заменить void на int) и использовать, например, "возврат -1;" чтобы вернуться из основной программы. Это более переносимо, чем Environment.Exit () (который зависит от среды).
Нет необходимости изменять тип возвращаемого значения Main с void на int; просто используйте return; вместо return -1;
@DannyBeckett По соглашению, код выхода 0 означает успех, а ненулевое значение означает неудачу. return; указывает на успех через код выхода 0, а return -1; указывает на сбой.
Вы также можете установить код выхода, используя свойства: Environment.ExitCode = -1;
@ marcel-gosselin Работает даже как «Приложение Windows», но когда вы ждете завершения процесса. В случае использования кода возврата из приложения Windows в пакетном сценарии Windows -> измените вызов с «myApp.exe» на «start / wait myApp.exe», а затем проверьте% errorlevel%. Это помогло мне :)
Обратите внимание на ответ ниже @Vern DeHaven: простое возвращение int приведет к тому, что нет больше будет работать в C# 6.0 / Visual Studio 2015. (Сам наткнулся на это - очень запутанно!)
Документация MSDN имеет отличный пример, включая использование примера в пакетном файле.
Используйте 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» для «Успех» не случайно, а на самом деле является «стандартным» значением для этой ситуации.
Я знаю, что 0 - это стандарт для успеха. Есть ли согласованное соглашение для других кодов выхода или это просто бесплатно для всех? (Я предполагаю, что это те же числа, которые вы получите после выполнения запланированной задачи).
Вы говорите, что 0 - стандартное значение для успеха, и все же при преобразовании 0/1 в логическое значение 0 - ложь, а 1 - истина! Возможно, будет более точным сказать, что код выхода 0 означает «отсутствие ошибки», а не «успех», поскольку код выхода - это ErrorResult, а не просто результат.
Полный список соглашений Microsoft см. В разделе msdn.microsoft.com/en-us/library/windows/desktop/…. Какой-то парень составил огромный список констант и использовал его в случае переключения в комментариях ниже.
@MarkShapiro, я думаю, 0 = Success исходит из того факта, что требуется только один код успеха, но многие коды ошибок, такие как 0, как отсутствие + или - в компьютерных целых числах, могут использоваться для однозначной идентификации успеха
: int вроде не нужен, в любом случае гипс нужен.
@MarkShapiro Можно было бы рассматривать это как код выхода, указывающий на то, завершилась ли программа ненормально (и если да, то каким образом). В этом случае false, являющийся стандартным возвращаемым значением для нормального завершения, имеет смысл (и, что более важно, упрощает использование парадигмы if (exit code) { handle error; }).
Здесь могут быть интересны документы glibc о статусе выхода. Эти значения определены в stdlib.h: gnu.org/software/libc/manual/html_node/Exit-Status.html
Вариант перечисления превосходен, однако его можно улучшить, умножив числа, как в:
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 и т. д.
Это если вы потрудитесь проверить наличие дальнейших ошибок после того, как столкнетесь с одной из них. Большинство приложений этого не делают.
Если вы собираетесь использовать метод, предложенный Дэвидом, вам также следует взглянуть на атрибут [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.
Малоизвестный факт заключается в том, что [Flags] ничего не делает для включения или отключения побитовых операций. Все, что он делает, - это переопределяет метод ToString, чтобы выходные данные представляли побитовые флаги. С ним или без него вы все равно можете выполнять побитовые операции.
@Steven, это приятно знать, но я все же рекомендую украшать перечисления, предназначенные для «использования флага», этим атрибутом, если ничто другое не передает намерения.
Есть три метода, которые можно использовать для возврата кода выхода из консольного приложения.
Main в своем приложении, чтобы он возвращал int вместо void (функция, которая возвращает Integer вместо Sub в VB.Net), а затем возвращала код выхода из этого метода.Main возвращает что-либо, кроме void (это Sub в VB.Net), значение этого свойства будет проигнорировано.Важным стандартом, который следует соблюдать, является то, что 0 означает «успех».
По связанной теме рассмотрите возможность использования перечисления для определения кодов выхода, которые ваше приложение собирается возвращать. FlagsAttribute позволит вам вернуть комбинацию кодов.
Также убедитесь, что ваше приложение скомпилировано как «Консольное приложение».
Это поднимает интересный момент. Установка Environment.ExitCode не закрывает программу немедленно, но метод Environment.Exit закрывает программу немедленно.
Код выхода также работает в приложениях Windows. Если приложение будет запущено из C# через объект Process, вы можете запросить у объекта WaitForExit(), а затем запросить у него код выхода.
Мои 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
В качестве обновления отвечать Скотта Манро:
Main не имеет никакого эффекта.main.Можно ли проверить ваш 1-й пункт относительно C# 6? Кажется, я ничего не могу найти в Интернете. Возвращаемое значение из функции Main прикрепляется к коду выхода процесса (по крайней мере, во всех предыдущих компиляторах), почему они должны были это изменить?
Чистое анекдотическое свидетельство, но я только что столкнулся с этим в своей собственной библиотеке, где простой возврат моего кода результата / ошибки из Main() не устанавливал Process.ExitCode в том виде, в каком его видит вызывающее приложение.
MSDN утверждает, что int Main по-прежнему можно использовать в качестве альтернативы Environment.ExitCode. связь
У меня есть приложение, которое запускает несколько потоков. В определенных обстоятельствах мне нужно перекрыть некоторые потоки с помощью Thread.Abort () перед выходом из приложения. В этих обстоятельствах int Main () {... thread.Abort (); ... return 0;} НЕ приводит к тому, что код выхода процесса равен 0: код выхода процесса равен -1. Похоже, что в определенных обстоятельствах MS решила, что соглашение об использовании возвращаемого значения основного потока для установки кода выхода процесса для них недостаточно. Честно говоря, это может быть проблема с синхронизацией: прерывание потока может устанавливать код выхода очень поздно в игре.
Используйте этот код
Environment.Exit(0);
используйте 0 как int, если вы не хотите ничего возвращать.
Это не ответ на вопрос OP, и возвращение 0 что-то возвращает ...
он возвращает то, что обычно возвращает приложение. Если вы не укажете его, приложение вернет 0
Просто другой способ:
public static class ApplicationExitCodes
{
public static readonly int Failure = 1;
public static readonly int Success = 0;
}
Любая техническая причина, по которой вы просто не написали «Environment.Exit (2);» ?