.NETでコンソールアプリケーションの終了コードを指定するにはどうすればよいですか?


471

.NETに簡単なコンソールアプリケーションがあります。これは、より大きなアプリケーションのテスト部分にすぎません。コンソールアプリケーションの「終了コード」を指定したいのですが。どうすればよいですか?

回答:


599

3つのオプション:

  • メソッドを返すMainように宣言すれば、それを返すことができます。Mainint
  • あなたが呼び出すことができますEnvironment.Exit(code)
  • プロパティを使用して終了コードを設定できますEnvironment.ExitCode = -1;。これは、戻りコードを設定したり、上記の他のオプションのいずれかを使用したりする場合に使用されます。

アプリケーション(コンソール、サービス、Webアプリなど)に応じて、さまざまな方法を使用できます。


12
なぜこれが機能しないのか疑問に思う方のために、プロジェクトが「Windowsアプリケーション」ではなく「コンソールアプリケーション」としてコンパイルされていることを確認してください。
Marcel Gosselin

9
引数のあるWinFormsアプリがコンソールアプリとして動作するようにしたい場合はどうなりますか?
sebagomez

5
また、メインプログラムをint(voidをintに置き換える)と入力して、たとえば "return -1;"を使用することもできます。メインプログラムから戻る。これは、Environment.Exit()(環境によって異なります)よりも移植性があります。
werner 2013

14
@DannyBeckett慣例により、の終了コード0は成功を意味し、ゼロ以外の値は失敗を意味します。return;終了コードを通じて成功を示し、失敗0return -1;示します。
allonhadaya 2013年

6
プロパティを使用して終了コードを設定することもできます。Environment.ExitCode = -1;
t3b4n 2016

270

リターンintをカバーする答えに加えて...正気の嘆願。必要に応じてフラグを付けて、列挙型で終了コードを定義してください。デバッグとメンテナンスが非常に簡単になります(おまけとして、ヘルプ画面で終了コードを簡単に出力できます-そのうちの1つはありますよね?)。

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がインターネット史上最高のWebサイトである理由です。このアドバイスはどの教科書でもすぐに利用できず、熟練した専門家と話すことによってのみ収集できます。ありがとうございました。
Daniel Szabo

17
0は成功の標準値であると言いますが、0/1をブール値に変換する場合、0は偽で1は真です!終了コードは単なるResultではなくErrorResultであるため、終了コード0は「成功」ではなく「エラーなし」を意味すると言う方が正確かもしれません。
Mark Shapiro

11
Microsoftの規則の完全なリストについては、msdn.microsoft.com / en- us / library / windows / desktop /…を参照してください。ある人はconstの膨大なリストを作成し、スイッチケースで以下のコメントに使用しました。
nawfal 2014年

5
@MarkShapiro、0 = Success成功コードは1つしか必要ないという事実から来ていると思いますが、コンピューター整数に+または-がないような0など、多くのエラーコードを使用して成功を一意に識別できます
Sebastian

49

コンソールアプリケーションから終了コードを返すために使用できる3つの方法があります。

  1. Mainアプリケーションのメソッドを変更して、int代わりにvoid(VB.NetのInteger代わりにを返す関数)を返し、Subそのメソッドから終了コードを返すようにします。
  2. Environment.ExitCodeプロパティを終了コードに設定します。メソッド1.が優先されることに注意してください。MainメソッドがvoidSubVB.Netの)以外のものを返す場合、このプロパティの値は無視されます。
  3. 終了コードをEnvironment.Exitメソッドに渡します。これにより、他の2つの方法とは異なり、プロセスが即座に終了します。

遵守すべき重要な基準は、0「成功」を表すものです。

関連トピックでは、列挙型を使用して、アプリケーションが返す終了コードを定義することを検討してください。FlagsAttributeは、あなたがコードの組み合わせを返すことができます。

また、アプリケーションが「コンソールアプリケーション」としてコンパイルされていることを確認してください。


1
これは興味深い点をもたらします。設定Environment.ExitCodeはプログラムをすぐに閉じませんが、Environment.Exitメソッドはプログラムをすぐに閉じます
PsychoData

1
終了コードは、Windowsアプリケーションでも機能します。アプリがProcessオブジェクトを介してC#から起動される場合は、オブジェクトにをWaitForExit()要求し、そこから終了コードを要求できます。
Nyerguds 2014

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を返す必要があります
ピートKirkham

3
ほとんど知られていない事実は、[フラグ]がビット単位の操作を有効または無効にするために何もしないことです。出力がビットごとのフラグを表すように、ToStringメソッドをオーバーライドするだけです。それがあってもなくても、ビット単位の操作を行うことができます。
Steven

3
@Steven知っておくと便利ですが、「フラグの使用」を目的とした列挙型をその属性で装飾することをお勧めします。
MarioDS 2017年

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);
マークラカタ

19
@Mark Lakta:では、変更しますか?
エステバンアラヤ

11

メインにvoidの戻り署名がある場合は、ExitCodeを使用します。それ以外の場合は、返される値でそれを「設定」する必要があります。

Environment.ExitCodeプロパティ

Mainメソッドがvoidを返す場合、このプロパティを使用して、呼び出し環境に返される終了コードを設定できます。Mainがvoidを返さない場合、このプロパティは無視されます。このプロパティの初期値はゼロです。


8

Scott Munroの回答の更新として:

  • C#6.0およびVB.NET 14.0(VS 2015)では、コンソールアプリケーションからゼロ以外のコードを返すには、Environment.ExitCodeまたはEnvironment.Exit(exitCode)が必要です。の戻り値の型を変更しMainても効果はありません。
  • F#4.0(VS 2015)では、mainエントリポイントの戻り値が考慮されます。

C#6に関する最初のポイントを確認できますか?オンラインで何も見つけられないようです。Main関数からの戻り値は、プロセスの終了コード(少なくとも以前のすべてのコンパイラでは)に添付されていますが、なぜ変更する必要があるのでしょうか。
Arman McHitarian 2016年

純粋な逸話的な証拠ですが、自分のライブラリでこれに遭遇しただけで、結果/エラーコードを単に返すだけでは、呼び出し元のアプリケーションで見られるがMain()設定さProcess.ExitCodeれませんでした。
Marcus Mangelsdorf、2016

MSDN int MainはまだEnvironment.ExitCodeの代替として使用できると主張しています。 リンク
Arman McHitarian 16

複数のスレッドを実行するアプリケーションがあります。特定の状況では、アプリケーションを終了する前に、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 2014

3

私の2セント:

システムエラーコードは、https//msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v = vs.85).aspxにあります。

「ファイルが見つかりません」の場合は2、「アクセス拒否」の場合は5などの一般的なコードが表示されます。

そして、不明なコードに遭遇した場合、このコマンドを使用して、それが何を意味するかを調べることができます。

net helpmsg decimal_code

例えば

ネットhelpmsg 1

戻り値

正しくない機能


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.