web-dev-qa-db-fra.com

Comment spécifier le code de sortie d'une application console dans .NET?

J'ai une application console triviale dans .NET. C'est juste une partie de test d'une application plus grande. J'aimerais spécifier le "code de sortie" de mon application console. Comment puis-je faire cela?

449
MrDatabase

3 options:

  • Vous pouvez le renvoyer depuis Main si vous déclarez votre méthode Main pour renvoyer int.
  • Vous pouvez appeler Environment.Exit(code) .
  • Vous pouvez définir le code de sortie à l'aide des propriétés: Environment.ExitCode = -1;. Ceci sera utilisé si rien d'autre ne définit le code de retour ou n'utilise l'une des options ci-dessus).

Selon votre application (console, service, application Web, etc.), différentes méthodes peuvent être utilisées.

569
TheSoftwareJedi

En plus des réponses couvrant les retours, un plaidoyer pour la santé mentale. Veuillez définir vos codes de sortie dans un enum, avec des drapeaux si nécessaire. Cela facilite énormément le débogage et la maintenance (et, en prime, vous pouvez facilement imprimer les codes de sortie sur votre écran d’aide - vous en avez un, n’est-ce pas?).

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

int Main(string[] args) {
   return (int)ExitCode.Success;
}
257
Mark Brackett

Vous pouvez utiliser trois méthodes pour renvoyer un code de sortie à partir d'une application console.

  1. Modifiez la méthode Main dans votre application afin qu'elle renvoie un int au lieu de void (une fonction qui renvoie un Integer au lieu de Sub dans VB.Net. ) puis renvoyer le code de sortie de cette méthode.
  2. Définissez la propriété Environment.ExitCode sur le code de sortie. Notez que la méthode 1. est prioritaire - si la méthode Main renvoie autre chose que void (est un Sub dans VB.Net), la valeur de cette propriété sera ignorée.
  3. Transmettez le code de sortie à la méthode Environment.Exit . Cela mettra immédiatement fin au processus, par opposition aux deux autres méthodes.

Une norme importante à respecter est que 0 représente le "succès".

Sur un sujet connexe, envisagez d'utiliser une énumération pour définir les codes de sortie que votre application va renvoyer. Le FlagsAttribute vous permettra de renvoyer une combinaison de codes.

Assurez-vous également que votre application est compilée en tant qu '"application console".

46
Scott Munro

Si vous allez utiliser la méthode suggérée par David, vous devriez également jeter un coup d'œil à l'attribut [Flags].

Cela vous permet de faire des opérations sages sur des enums.

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

Ensuite

(ExitCodes.SignFailed | ExitCodes.UnknownError)

serait 16 + 32. :)

43
Aron Tsang
25
albertein
int code = 2;
Environment.Exit( code );
24
palehorse

Il suffit de renvoyer le code approprié à partir de main.

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

Utilisez ExitCode si votre main a une signature avec retour nul, sinon vous devez la "régler" en fonction de la valeur que vous retournez.

Propriété Environment.ExitCode

Si la méthode Main retourne void, vous pouvez utiliser cette propriété pour définir le code de sortie qui sera renvoyé à l'environnement appelant. Si Main ne renvoie pas vide, cette propriété est ignorée. La valeur initiale de cette propriété est zéro.

11
crashmstr

Pour mettre à jour Scott Munro réponse :

  • Dans C # 6.0 et VB.NET 14.0 (VS 2015), Environment.ExitCode ou Environment.Exit (exitCode) est requis pour renvoyer un code différent de zéro à partir d'une console. application. Changer le type de retour de Main n'a aucun effet.
  • Dans la version F # 4.0 (VS 2015), la valeur de retour du point d’entrée main est respectée.
8
Vern DeHaven

L'option de dénombrement est excellente, mais peut être améliorée en multipliant les nombres comme suit:

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

Dans le cas d'erreurs multiples, l'addition des numéros d'erreur spécifiques ensemble vous donnera un numéro unique qui représentera la combinaison des erreurs détectées.

Par exemple, un niveau d'erreur de 6 ne peut consister que d'erreurs 4 et 2, 12 ne peut contenir que des erreurs 4 et 8, 14 ne peut comprendre que 2, 4 et 8, etc.

7
David

Mes 2 centimes:

Vous pouvez trouver les codes d'erreur système ici: https://msdn.Microsoft.com/en-us/library/windows/desktop/ms681382 (v = vs.85) .aspx

Vous trouverez les codes typiques comme 2 pour "fichier non trouvé" ou 5 pour "accès refusé".

Et lorsque vous tombez sur un code inconnu, vous pouvez utiliser cette commande pour savoir ce que cela signifie:

net helpmsg decimal_code

par exemple.

aide nette 1

résultats

Fonction incorrecte

3
Fred Mauroy

Utilisez ce code

Environment.Exit(0);

utilisez 0 comme int si vous ne voulez rien retourner.

0