Wie gebe ich den Exit-Code einer Konsolenanwendung in .NET an?

471

Ich habe eine einfache Konsolenanwendung in .NET. Es ist nur ein Testteil einer größeren Anwendung. Ich möchte den "Exit-Code" meiner Konsolenanwendung angeben. Wie mache ich das?

MrDatabase
quelle

Antworten:

599

3 Optionen:

  • Sie können es von zurückgeben, Mainwenn Sie Ihre MainMethode für die Rückgabe deklarieren int.
  • Sie können anrufen Environment.Exit(code).
  • Sie können den Exit-Code mithilfe der folgenden Eigenschaften festlegen : Environment.ExitCode = -1;. Dies wird verwendet, wenn nichts anderes den Rückkehrcode festlegt oder eine der anderen oben genannten Optionen verwendet.

Abhängig von Ihrer Anwendung (Konsole, Dienst, Webanwendung usw.) können verschiedene Methoden verwendet werden.

TheSoftwareJedi
quelle
12
Wenn Sie sich fragen, warum dies in ihrem Fall nicht funktioniert, stellen Sie sicher, dass Ihr Projekt als "Konsolenanwendung" und nicht als "Windows-Anwendung" kompiliert ist.
Marcel Gosselin
9
Was ist, wenn ich eine WinForms-App habe, die sich mit einigen Argumenten wie eine Konsolen-App verhalten soll?
Sebagomez
5
Sie können das Maine-Programm auch einfach als int eingeben (void durch int ersetzen) und zB "return -1;" vom Hauptprogramm zurückkehren. Dies ist portabler als Environment.Exit () (abhängig von der Umgebung).
Werner
14
@DannyBeckett Konventionell bedeutet ein Exit-Code für 0Erfolg, und ein Wert ungleich Null bedeutet Misserfolg. return;Zeigt Erfolg durch Exit-Code 0an und return -1;zeigt Fehler an.
Allonhadaya
6
Sie können den Exit-Code auch mithilfe der folgenden Eigenschaften festlegen: Environment.ExitCode = -1;
t3b4n
270

Zusätzlich zu den Antworten auf die Rückgabe ... ein Plädoyer für geistige Gesundheit. Bitte definieren Sie Ihre Exit-Codes in einer Aufzählung, gegebenenfalls mit Flags. Dies erleichtert das Debuggen und die Wartung erheblich (und als Bonus können Sie die Exit-Codes einfach auf Ihrem Hilfebildschirm ausdrucken - Sie haben einen davon, oder?).

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

int Main(string[] args) {
   return (int)ExitCode.Success;
}
Mark Brackett
quelle
46
Vielleicht möchten Sie hinzufügen, dass der Wert "0" für "Erfolg" nicht zufällig ist, sondern der "Standard" -Wert für diese Situation.
Christian.K
39
DIESE. Aus diesem Grund ist SO die größte Website in der Geschichte des Internets. Dieser Rat ist in keinem Lehrbuch verfügbar und kann nur durch ein Gespräch mit einem erfahrenen Fachmann eingeholt werden. VIELEN DANK.
Daniel Szabo
17
Sie sagen, dass 0 der Standardwert für den Erfolg ist, und dennoch ist 0 falsch und 1 ist wahr, wenn 0/1 in einen Booleschen Wert konvertiert wird! Es kann genauer sein zu sagen, dass ein Exit-Code von 0 "kein Fehler" bedeutet und nicht "Erfolg", da der Exit-Code ein Fehlerergebnis ist, nicht nur ein Ergebnis.
Mark Shapiro
11
Eine vollständige Liste der Microsoft-Konventionen finden Sie unter msdn.microsoft.com/en-us/library/windows/desktop/… . Ein Typ hat eine riesige Liste von Konstanten erstellt und sie in einem Schalterfall in Kommentaren weiter unten verwendet.
Nawfal
5
@ MarkShapiro, ich denke, 0 = Successkommt von der Tatsache, dass nur ein Erfolgscode benötigt wird, aber viele Fehlercodes, so dass 0, ohne + oder - in Computer-Ganzzahlen, verwendet werden kann, um den Erfolg eindeutig zu identifizieren
Sebastian
49

Es gibt drei Methoden, mit denen Sie einen Exit-Code aus einer Konsolenanwendung zurückgeben können.

  1. Ändern Sie die MainMethode in Ihrer Anwendung so, dass sie ein intanstelle von void(eine Funktion, die ein Integerstatt in Subin VB.Net zurückgibt) zurückgibt, und geben Sie dann den Exit-Code dieser Methode zurück.
  2. Setzen Sie die Environment.ExitCode- Eigenschaft auf den Exit-Code. Beachten Sie, dass Methode 1. Vorrang hat. Wenn die MainMethode etwas anderes als void( Subin VB.Net) zurückgibt, wird der Wert dieser Eigenschaft ignoriert.
  3. Übergeben Sie den Exit-Code an die Environment.Exit- Methode. Dadurch wird der Prozess im Gegensatz zu den beiden anderen Methoden sofort beendet.

Ein wichtiger Standard, der beachtet werden sollte, ist 0der „Erfolg“.

Verwenden Sie zu einem verwandten Thema eine Aufzählung, um die Exit-Codes zu definieren, die Ihre Anwendung zurückgeben wird. Mit dem FlagsAttribute können Sie eine Kombination von Codes zurückgeben.

Stellen Sie außerdem sicher, dass Ihre Anwendung als "Konsolenanwendung" kompiliert ist.

Scott Munro
quelle
1
Dies bringt einen interessanten Punkt auf. Die Einstellung Environment.ExitCodeschließt das Programm nicht sofort, aber die Environment.ExitMethode schließt das Programm sofort
PsychoData
1
Der Exit-Code funktioniert auch in Windows-Anwendungen. Wenn die App von c # über ein ProcessObjekt gestartet werden soll, können Sie das Objekt dazu WaitForExit()auffordern und dann den Exit-Code von ihm anfordern.
Nyerguds
43

Wenn Sie die von David vorgeschlagene Methode verwenden möchten, sollten Sie sich auch das Attribut [Flags] ansehen.

Auf diese Weise können Sie bitweise Operationen an Aufzählungen ausführen.

[Flags]
enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}

Dann

(ExitCodes.SignFailed | ExitCodes.UnknownError)

wäre 16 + 32. :)

Aron Tsang
quelle
3
Dies bedeutet, dass ein Programm "Ihr Passwort ist falsch" sagt und dann versucht, alles zu signieren, was es signiert, und nur dann stoppt, wenn es dann fehlschlägt. Sie sollten zurückkehren, sobald Sie versagt haben. Alles andere ist eine Warnung und das Programm sollte immer noch 0 zurückgeben.
Pete Kirkham
3
Wenig bekannt ist, dass [Flags] nichts unternimmt, um bitweise Operationen zu aktivieren oder zu deaktivieren. Es wird lediglich die ToString-Methode überschrieben, sodass die Ausgabe die bitweisen Flags darstellt. Mit oder ohne können Sie immer noch bitweise Operationen ausführen.
Steven
3
@Steven, das ist gut zu wissen, aber ich würde trotzdem empfehlen, Enums, die für die "Flaggenverwendung" bestimmt sind, mit diesem Attribut zu dekorieren, wenn nichts anderes Absicht vermittelt.
MarioDS
25
int code = 2;
Environment.Exit( code );
Palehorse
quelle
17
Aus irgendeinem technischen Grund haben Sie nicht einfach "Environment.Exit (2)" geschrieben. ?
Blorgbeard ist
52
Das Zuweisen einer magischen Zahl zu einer Variablen mit einem bedeutungslosen Namen macht sie nicht weniger magisch.
Blorgbeard ist
11

Geben Sie einfach den entsprechenden Code von main zurück.

int main(string[] args)
{
      return 0; //or exit code of your choice
}
Esteban Araya
quelle
2
Die Standard-C # -Konsolen-App deklariert main überhaupt nicht. Es erklärt static void Main(string[] args);
Mark Lakata
19
@ Mark Lakta: Dann ändern Sie es, nein?
Esteban Araya
11

Verwenden Sie ExitCode, wenn Ihr Main eine ungültige Rückgabesignatur hat, andernfalls müssen Sie diese auf den von Ihnen zurückgegebenen Wert "setzen".

Environment.ExitCode-Eigenschaft

Wenn die Main-Methode void zurückgibt, können Sie mit dieser Eigenschaft den Exit-Code festlegen, der an die aufrufende Umgebung zurückgegeben wird. Wenn Main nicht void zurückgibt, wird diese Eigenschaft ignoriert. Der Anfangswert dieser Eigenschaft ist Null.

Crashmstr
quelle
8

Als Update zu Scott Munros Antwort :

  • In C # 6.0 und VB.NET 14.0 (VS 2015) ist entweder Environment.ExitCode oder Environment.Exit (exitCode) erforderlich, um einen Code ungleich Null von einer Konsolenanwendung zurückzugeben. Das Ändern des Rückgabetyps von Mainhat keine Auswirkung.
  • In F # 4.0 (VS 2015) wird der Rückgabewert des mainEinstiegspunkts berücksichtigt.
Vern DeHaven
quelle
Kann Ihr 1. Punkt in Bezug auf C # 6 überprüft werden? Ich kann online scheinbar nichts finden. Der Rückgabewert der Hauptfunktion wird an den Exit-Code des Prozesses angehängt (zumindest in allen vorherigen Compilern). Warum sollten sie das ändern?
Arman McHitarian
Reine anekdotische Beweise, aber ich bin gerade in meiner eigenen Bibliothek darauf gestoßen, wo durch einfaches Zurückgeben meines Ergebnis- / Fehlercodes Main()nicht das festgelegt wurde, Process.ExitCodewas von der aufrufenden Anwendung gesehen wurde.
Marcus Mangelsdorf
MSDN-Konflikte int Mainkönnen weiterhin als Alternative zu Environment.ExitCode verwendet werden. Link
Arman McHitarian
Ich habe eine Anwendung, die mehrere Threads ausführt. Unter bestimmten Umständen muss ich einige Threads über Thread.Abort () blockieren, bevor ich die Anwendung beende. Unter diesen Umständen int Main () {... thread.Abort (); ... return 0;} führt NICHT zu einem Prozess-Exit-Code von 0: Der Prozess-Exit-Code ist -1. Es scheint, dass MS unter bestimmten Umständen entschieden hat, dass die Konvention, den Rückgabewert des Hauptthreads zum Festlegen des Exit-Codes des Prozesses zu verwenden, für sie nicht gut genug ist. Fairerweise könnte es sich um ein Timing-Problem handeln: Durch den Thread-Abbruch wird der Exit-Code möglicherweise sehr spät im Spiel festgelegt.
David I. McIntosh
7

Die Aufzählungsoption ist ausgezeichnet, kann jedoch durch Multiplizieren der Zahlen wie folgt verbessert werden:

enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}

Bei mehreren Fehlern erhalten Sie durch Addition der spezifischen Fehlernummern eine eindeutige Nummer, die die Kombination der erkannten Fehler darstellt.

Beispielsweise kann eine Fehlerstufe von 6 nur aus den Fehlern 4 und 2 bestehen, 12 kann nur aus den Fehlern 4 und 8 bestehen, 14 kann nur aus 2, 4 und 8 bestehen usw.

David
quelle
2
Dies ist jedoch der Fall, wenn Sie nach einem Fehler nach weiteren Fehlern suchen. Die meisten Apps tun dies nicht.
Nyerguds
3

Meine 2 Cent:

Die Systemfehlercodes finden Sie hier: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

Sie finden die typischen Codes wie 2 für "Datei nicht gefunden" oder 5 für "Zugriff verweigert".

Und wenn Sie auf einen unbekannten Code stoßen, können Sie mit diesem Befehl herausfinden, was er bedeutet:

net helpmsg decimal_code

z.B

net helpmsg 1

kehrt zurück

Falsche Funktion

Fred Mauroy
quelle
0

Verwenden Sie diesen Code

Environment.Exit(0);

Verwenden Sie 0 als int, wenn Sie nichts zurückgeben möchten.

Swastik Bhattacharyya
quelle
Dies beantwortet nicht die Frage von OP und die Rückgabe von 0 gibt etwas zurück ...
PL