.NET에서 콘솔 응용 프로그램의 종료 코드를 어떻게 지정합니까?


471

.NET에 간단한 콘솔 응용 프로그램이 있습니다. 더 큰 응용 프로그램의 테스트 부분 일뿐입니다. 콘솔 응용 프로그램의 "종료 코드"를 지정하고 싶습니다. 어떻게해야합니까?

답변:


599

3 가지 옵션 :

  • 메소드를 return으로 Main선언하면이를 리턴 할 수 있습니다 .Mainint
  • 에 전화 할 수 있습니다 Environment.Exit(code).
  • 속성을 사용하여 종료 코드를 설정할 수 있습니다 Environment.ExitCode = -1;. 다른 방법으로 리턴 코드를 설정하거나 위의 다른 옵션 중 하나를 사용하는 경우에 사용됩니다.

응용 프로그램 (콘솔, 서비스, 웹 앱 등)에 따라 다른 방법을 사용할 수 있습니다.


12
왜 이것이 작동하지 않는지 궁금해하는 분들을 위해 프로젝트가 "Windows 응용 프로그램"이 아닌 "콘솔 응용 프로그램"으로 컴파일되어 있는지 확인하십시오.
— Marcel Gosselin

9
args를 사용하여 콘솔 응용 프로그램으로 작동하기를 원하는 WinForms 응용 프로그램이있는 경우 어떻게해야합니까?
— sebagomez

5
메인 프로그램을 int로 입력하고 (int로 void를 대체) "return -1;" 메인 프로그램에서 돌아옵니다. 환경에 따라 Environment.Exit ()보다 이식성이 뛰어납니다.
— werner

14
@DannyBeckett 관례 적으로, 종료 코드는 0성공 을 의미하고 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"값은 우연이 아니라 실제로 해당 상황에 대한 "표준"값임을 추가 할 수 있습니다.
— Christian.K

39
이. 이것이 SO가 인터넷 역사상 가장 위대한 웹 사이트 인 이유입니다. 이 조언은 어떤 교과서에서도 쉽게 구할 수 없으며, 노련한 전문가와 대화를 통해서만 얻을 수 있습니다. 감사합니다.
— Daniel Szabo

17
0은 성공의 표준 값이지만 0/1을 부울로 변환 할 때 0은 false이고 1은 true입니다. 종료 코드는 단순히 결과가 아니라 ErrorResult이므로 종료 코드 0은 "성공"이 아니라 "오류 없음"을 의미하는 것이 더 정확할 수 있습니다.
— 마크 샤피로

11
Microsoft 규칙의 전체 목록은 msdn.microsoft.com/en-us/library/windows/desktop/…를 참조 하십시오 . 어떤 사람은 거대한 const 목록을 만들고 아래의 주석에서 스위치 케이스에 사용했습니다.
— nawfal

5
@MarkShapiro, 0 = Success하나의 성공 코드 만 필요하다는 사실에서 비롯된 것 같습니다 . 그러나 0 또는 컴퓨터 정수가 없거나 0은 성공을 고유하게 식별하는 데 사용할 수있는 많은 오류 코드
— Sebastian

49

콘솔 애플리케이션에서 종료 코드를 리턴하는 데 사용할 수있는 세 가지 방법이 있습니다.

  1. 수정 Main그것이 반환하도록 응용 프로그램에서 방법을 int대신 void(다시 표시하는 기능을 Integer대신 Sub하고 그 방법에서 종료 코드를 반환 VB.Net에서 참조).
  2. Environment.ExitCode 특성을 종료 코드로 설정하십시오 . 메소드 1이 우선합니다. Main메소드가 VB.Net에 void있는 것 이외의 것을 리턴 하면 Sub이 특성의 값은 무시됩니다.
  3. 종료 코드를 Environment.Exit 메소드에 전달하십시오. 다른 두 가지 방법과 달리 프로세스가 즉시 종료됩니다.

지켜야 할 중요한 표준 0은 '성공' 을 나타냅니다.

관련 주제에서 열거를 사용하여 애플리케이션이 리턴 할 종료 코드를 정의하십시오. 있는 FlagsAttribute는 당신이 코드의 조합을 반환 할 수 있습니다.

또한 응용 프로그램이 '콘솔 응용 프로그램'으로 컴파일되어 있는지 확인하십시오.


1
이것은 흥미로운 점을 제시합니다. 설정 Environment.ExitCode은 프로그램을 즉시 Environment.Exit닫지 않지만 메소드는 프로그램을 즉시 닫습니다
— PsychoData

1
종료 코드는 Windows 응용 프로그램에서도 작동합니다. 앱이 c #에서 Process객체를 통해 시작되는 경우 객체 WaitForExit()에을 요청한 다음 종료 코드를 요청할 수 있습니다.
— Nyerguds

43

David가 제안한 방법을 사용하려면 [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을 반환해야합니다.
— Pete Kirkham

3
알려진 사실은 [Flags]가 비트 단위 연산을 활성화하거나 비활성화하는 데 아무런 영향을 미치지 않는다는 것입니다. 출력이 비트 플래그를 나타내도록 ToString 메소드를 대체하기 만하면됩니다. 그것의 유무에 관계없이, 여전히 비트 연산을 할 수 있습니다.
— Steven

3
@Steven은 알고 있지만 멋지지만 의도가없는 "플래그 사용"을위한 열거 형을 그 속성으로 꾸미는 것이 좋습니다.
— MarioDS

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

17
"Environment.Exit (2 ;; ?
— Blorgbeard는

52
의미없는 이름을 가진 변수에 마법의 숫자를 할당한다고해서 마법이 줄어들지는 않습니다.
— Blorgbeard는


11

main에서 적절한 코드를 반환하십시오.

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

2
기본 C # 콘솔 앱은 main을 전혀 선언하지 않습니다. 그것은 선언한다 static void Main(string[] args);
— Mark Lakata

19
@ Mark Lakta : 그럼 바꾸지 않겠습니까?
— Esteban Araya

11

메인에 void 리턴 서명이있는 경우 ExitCode를 사용하십시오. 그렇지 않으면 리턴 한 값으로 "설정"해야합니다.

Environment.ExitCode 속성

Main 메소드가 void를 리턴하면이 특성을 사용하여 호출 환경으로 리턴 될 종료 코드를 설정할 수 있습니다. Main이 void를 반환하지 않으면이 속성은 무시됩니다. 이 속성의 초기 값은 0입니다.


8

Scott Munro의 답변에 대한 업데이트 :

  • C # 6.0 및 VB.NET 14.0 (VS 2015)에서는 콘솔 응용 프로그램에서 0이 아닌 코드를 반환하려면 Environment.ExitCode 또는 Environment.Exit (exitCode) 가 필요합니다. 의 반환 유형을 변경해 Main도 아무런 영향이 없습니다.
  • F # 4.0 (VS 2015)에서는 main진입 점 의 반환 값 이 존중됩니다.

C # 6에 관한 첫 번째 포인트를 확인할 수 있습니까? 온라인에서 찾을 수없는 것 같습니다. Main 함수의 반환 값은 프로세스의 종료 코드 (적어도 모든 이전 컴파일러에서)에 붙어 있는데 왜 변경해야합니까?
— Arman McHitarian

순수한 일화적인 증거이지만 방금 내 라이브러리 에서이 결과 를 보았습니다. 여기서 결과 / 오류 코드를 반환 하는 것이 호출 응용 프로그램에서 볼 수 Main()있는 Process.ExitCode것처럼 설정되지 않았습니다 .
— Marcus Mangelsdorf

MSDN contends int Main는 여전히 Environment.ExitCode의 대안으로 사용될 수 있습니다. 링크
— Arman McHitarian

여러 스레드를 실행하는 응용 프로그램이 있습니다. 특정 상황에서 응용 프로그램을 종료하기 전에 Thread.Abort ()를 통해 일부 스레드를 클로버해야합니다. 이러한 상황에서, int Main () {... thread.Abort (); ... return 0;}은 프로세스 종료 코드 0을 생성하지 않습니다. 프로세스 종료 코드는 -1입니다. 특정 상황에서 MS는 프로세스의 종료 코드를 설정하기 위해 메인 스레드의 반환 값을 사용하는 규칙이 충분하지 않은 것으로 판단했습니다. 공평하게 말하면 타이밍 문제 일 수 있습니다. 스레드 중단이 게임에서 매우 늦은 종료 코드를 설정했을 수 있습니다.
— David I. McIntosh

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


0

이 코드를 사용하십시오

Environment.Exit(0);

아무것도 반환하지 않으려면 0을 정수로 사용하십시오.


이것은 OP의 질문에 대답하지 않고 0을 반환하면 무언가를 반환하는 것입니다.
— PL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.