558 votes

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

J'ai une application console triviale en .NET. Il s'agit simplement d'une partie test d'une application plus large. J'aimerais spécifier le "code de sortie" de mon application console. Comment faire ?

704voto

TheSoftwareJedi Points 15921

Trois options :

  • Vous pouvez le renvoyer à partir de Main si vous déclarez votre Main pour renvoyer la méthode int .
  • Vous pouvez appeler Environment.Exit(code) .
  • Vous pouvez régler la code de sortie en utilisant des propriétés : Environment.ExitCode = -1; . Cette option sera utilisée si rien d'autre ne fixe le code de retour ou n'utilise l'une des autres options ci-dessus).

En fonction de votre application (console, service, application web, etc.), différentes méthodes peuvent être utilisées.

17 votes

Pour ceux d'entre vous qui se demandent pourquoi cela ne fonctionne pas dans leur cas, assurez-vous que votre projet est compilé comme une "application console" et non comme une "application Windows".

11 votes

Que se passe-t-il si j'ai une application WinForms et que je veux qu'elle se comporte comme une application console avec certains paramètres ?

5 votes

Vous pouvez également taper le programme principal en int (remplacer void par int) et utiliser par exemple "return -1 ;" pour revenir du programme principal. Cette méthode est plus portable que Environment.Exit() (qui dépend de l'environnement).

305voto

Mark Brackett Points 46824

En plus des réponses couvrant les int's de retour... un appel à la raison. S'il vous plaît, s'il vous plaît, définissez vos codes de sortie dans une énumération, avec des drapeaux si nécessaire. Cela facilite grandement 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;
}

57 votes

Vous pourriez ajouter que la valeur "0" pour "Succès" n'est pas le fruit du hasard, mais qu'il s'agit en fait de la valeur "standard" pour cette situation.

2 votes

Je suis conscient que 0 est la norme en matière de réussite. Existe-t-il une convention pour les autres codes de sortie ou est-ce que tout le monde est libre ? (Je suppose qu'il s'agit des mêmes chiffres que ceux que l'on obtient après l'exécution d'une tâche programmée).

21 votes

Vous dites que 0 est la valeur standard pour le succès, et pourtant, en convertissant 0/1 en valeur booléenne, 0 est faux et 1 est vrai ! Il serait plus juste de dire qu'un code de sortie de 0 signifie "pas d'erreur", plutôt que "succès", car le code de sortie est un ErrorResult et non un simple Result.

58voto

Scott Munro Points 4008

Il existe trois méthodes pour renvoyer un code de sortie à partir d'une application console.

  1. Modifier le Main dans votre application afin qu'elle renvoie un int au lieu de void (une fonction qui renvoie un Integer au lieu de Sub en VB.NET ) et renvoie le code de sortie de cette méthode.
  2. Régler le Environnement.ExitCode au code de sortie. Notez que la méthode 1. est prioritaire - si la propriété Main renvoie autre chose que void (est un Sub en VB.Net), la valeur de cette propriété sera ignorée.
  3. Transmettre le code de sortie à la fonction Environnement.Exit méthode. Cette méthode met fin au processus immédiatement, contrairement aux deux autres méthodes.

Une norme importante à respecter est la suivante 0 représente la "réussite".

Dans le même ordre d'idées, envisagez d'utiliser une énumération pour définir les codes de sortie que votre application va renvoyer. L'énumération Attribut de drapeau vous permettra de renvoyer une combinaison de codes.

Veillez également à ce que votre application soit compilée en tant qu'"application console".

2 votes

Cela soulève un point intéressant. Le réglage Environment.ExitCode ne ferme pas le programme immédiatement mais Environment.Exit ferme le programme immédiatement

2 votes

Le code de sortie fonctionne également sur les applications Windows. Si l'application est lancée à partir de c#, par l'intermédiaire d'une commande Process vous pouvez demander à l'objet de WaitForExit() et lui demander le code de sortie.

44voto

Aron Tsang Points 271

Si vous souhaitez utiliser la méthode proposée par David Vous pouvez également consulter l'attribut [Flags].

Cela vous permet d'effectuer des opérations en bits sur les enums.

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

Dans ce cas

(ExitCodes.SignFailed | ExitCodes.UnknownError)

serait 16 + 32 :)

4 votes

Cela implique qu'un programme dirait "votre mot de passe est erroné", puis essaierait de signer ce qu'il est en train de signer, et ne s'arrêterait que s'il échoue. Vous devez retourner une fois que vous avez échoué ; tout autre résultat est un avertissement et le programme doit toujours retourner 0.

3 votes

Un fait peu connu est que [Flags] ne fait rien pour activer ou désactiver les opérations bitwise. Tout ce qu'il fait, c'est surcharger la méthode ToString pour que la sortie représente les drapeaux bitwise. Avec ou sans, il est toujours possible d'effectuer des opérations bit à bit.

4 votes

@Steven c'est bien de le savoir mais je recommanderais quand même de décorer les enums destinés à l'utilisation de drapeaux avec cet attribut, ne serait-ce que pour véhiculer l'intention.

26voto

palehorse Points 8268
int code = 2;
Environment.Exit( code );

19 votes

Y a-t-il une raison technique pour laquelle vous n'avez pas simplement écrit "Environment.Exit( 2 ) ;" ?

64 votes

L'attribution d'un nombre magique à une variable dont le nom n'a pas de sens ne la rend pas moins magique.

3 votes

@Blorgbeard - Sept ans se sont écoulés entre vos deux commentaires. C'est un peu épique :-D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X