2010-07-08 2 views
4

Comment le code d'erreur de retour peut-il être spécifié à la sortie de l'application? S'il s'agissait d'une application VC++, je pourrais utiliser les API SetLastError(ERROR_ACCESS_DENIED) - return GetLastError(). Y a-t-il un moyen de le faire en C#?Spécification du code d'erreur de retour à la sortie de l'application

static int Main(string[] args) 
    { 
    Tool.Args = args; 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Download_Tool()); 

    return Tool.ErrorCode; 
    } 

Comment la valeur Tool.ErrorCode peut-elle être définie intelligemment? Si j'essaie quelque chose comme Tool.ErrorCode = ERROR_ACCESS_DENIED, j'obtiens une erreur, "Le nom ERROR_ACCESS_DENIED n'existe pas dans le contexte actuel." Merci.

INFORMATIONS COMPLÉMENTAIRES

Mon exemple est trop simplifié. Y at-il un moyen de quelque chose comme ceci:

Tool.ErrorCode = ERROR_ACCESS_DENIED; 
return Tool.ErrorCode; 

... qui génère une erreur de compilation, plutôt que ceci:

Tool.ErrorCode = 5; 
return Tool.ErrorCode; 

... qui fonctionne, mais utilise un « nombre magique. " Je voudrais éviter l'utilisation de nombres magiques.

+0

C'est un fest downvoting. Je passerai. –

Répondre

9

http://msdn.microsoft.com/en-us/library/system.environment.exit.aspx

Environment.Exit(exitCode) 

Mise à jour

Je suppose que je voté vers le bas après la question a été mise à jour - sheesh. Et par l'auteur aussi ...

La raison pour laquelle vous obtenez une erreur de compilation avec "ERROR_ACCESS_DENIED" est que vous ne l'avez pas définie. Vous devez définir vous-même:

const int ERROR_ACCESS_DENIED = 5; 

Ensuite, vous pouvez utiliser:

Environment.Exit(ERROR_ACCESS_DENIED) 

Mise à jour 2

Si vous êtes à la recherche d'un ensemble prêt à l'emploi des constantes de Winerror.h pour vos besoins en C#, alors le voici:

http://www.pinvoke.net/default.aspx/Constants/WINERROR.html

Je

modifierait probablement le GetErrorName (...) méthode pour faire une mise en cache si, par exemple .:

private static Dictionary<int, string> _FieldLookup; 

public static bool TryGetErrorName(int result, out string errorName) 
{ 
    if (_FieldLookup == null) 
    { 
     Dictionary<int, string> tmpLookup = new Dictionary<int, string>(); 

     FieldInfo[] fields = typeof(ResultWin32).GetFields(); 

     foreach (FieldInfo field in fields) 
     { 
      int errorCode = (int)field.GetValue(null); 

      tmpLookup.Add(errorCode, field.Name); 
     } 

     _FieldLookup = tmpLookup; 
    } 

    return _FieldLookup.TryGetValue(result, out errorName); 
} 
+0

Cela ne résout pas le problème de l'utilisation de nombres magiques pour définir le code de sortie. –

+1

J'aimerais savoir pourquoi cela a été rejeté. Espérons que ce n'était pas après la mise à jour de la question. Je ne suis pas un lecteur d'esprit ... Ce serait assez pauvre. –

+0

Microsoft a déjà ces codes d'erreur définis quelque part. Dans une application VC++, ils peuvent être accédés par '#include" Winerror.h "'. N'y a-t-il pas quelque chose de similaire pour C#? http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx –

-2

Set Environment.ExitCode.

static void Main(string[] args) 
    { 
    Tool.Args = args; 

    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new Download_Tool()); 

    Environment.ExitCode = Tool.ErrorCode; 
    } 

Voir MSDN - Environment.ExitCode Property

+0

Cela ne résout pas le problème de l'utilisation de nombres magiques pour définir le code de sortie. –

+1

Le problème avec cet extrait de code est que la valeur de 'Environment.ExitCode' est ignorée si la méthode' Main' renvoie autre chose que void (c'est-à-dire 'int' dans ce cas). – fatuhoku

+0

J'ai changé l'extrait de code pour retourner void, de sorte que Environment.ExitCode ne sera pas ignoré. –

Questions connexes