.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.