c# - ¿Cómo especifico el código de salida de una aplicación de consola en.NET?
exit-code (11)
Tengo una aplicación de consola trivial en .NET. Es solo una parte de prueba de una aplicación más grande. Me gustaría especificar el "código de salida" de mi aplicación de consola. ¿Cómo hago esto?
3 opciones:
- Puede devolverlo desde
Main
si declara que su métodoMain
devuelveint
. - Puede llamar a
Environment.Exit(code)
. - Puede establecer el código de salida utilizando las propiedades:
Environment.ExitCode = -1;
. Esto se usará si nada más establece el código de retorno o utiliza una de las otras opciones anteriores.
Dependiendo de su aplicación (consola, servicio, aplicación web, etc.) se pueden utilizar diferentes métodos.
Además de las respuestas que cubren el retorno de la int ... una petición de cordura. Por favor, defina sus códigos de salida en una enumeración, con banderas si corresponde. Hace que la depuración y el mantenimiento sean mucho más fáciles (y, como beneficio adicional, puede imprimir fácilmente los códigos de salida en su pantalla de ayuda, sí tiene uno de ellos, ¿verdad?).
enum ExitCode : int {
Success = 0,
InvalidLogin = 1,
InvalidFilename = 2,
UnknownError = 10
}
int Main(string[] args) {
return (int)ExitCode.Success;
}
Como actualización de la answer Scott Munro:
- En C # 6.0 y VB.NET 14.0 (VS 2015), se requiere Environment.ExitCode o Environment.Exit para devolver un código distinto de cero desde una aplicación de consola. Cambiar el tipo de retorno de
Main
no tiene efecto. - En F # 4.0 (VS 2015), se respeta el valor de retorno del punto de entrada
main
.
Hay tres métodos que puede utilizar para devolver un código de salida desde una aplicación de consola.
- Modifique el método
Main
en su aplicación para que devuelva unint
lugar devoid
(una función que devuelve unInteger
lugar deSub
en VB.Net) y luego devuelva el código de salida de ese método. - Establezca la propiedad Environment.ExitCode en el código de salida. Tenga en cuenta que el método 1. tiene prioridad: si el método
Main
devuelve algo distinto devoid
(es unSub
en VB.Net), el valor de esta propiedad se ignorará. - Pase el código de salida al método Environment.Exit . Esto terminará el proceso inmediatamente a diferencia de los otros dos métodos.
Un estándar importante que debe observarse es que 0
representa ''Éxito''.
En un tema relacionado, considere usar una enumeración para definir los códigos de salida que su aplicación va a devolver. El FlagsAttribute te permitirá devolver una combinación de códigos.
Además, asegúrese de que su aplicación esté compilada como una ''Aplicación de consola''.
La opción de enumeración es excelente, sin embargo, se puede mejorar multiplicando los números como en:
enum ExitCodes : int
{
Success = 0,
SignToolNotInPath = 1,
AssemblyDirectoryBad = 2,
PFXFilePathBad = 4,
PasswordMissing = 8,
SignFailed = 16,
UnknownError = 32
}
En el caso de errores múltiples, sumar los números de error específicos juntos le dará un número único que representará la combinación de errores detectados.
Por ejemplo, un nivel de error de 6 solo puede consistir en los errores 4 y 2, 12 solo puede consistir en errores 4 y 8, 14 solo puede consistir en 2, 4 y 8, etc.
Mis 2 centavos:
Puede encontrar los códigos de error del sistema aquí: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx
Encontrará los códigos típicos como 2 para "archivo no encontrado" o 5 para "acceso denegado".
Y cuando te topas con un código desconocido, puedes usar este comando para averiguar qué significa:
net helpmsg decimal_code
p.ej
helpmsg neto 1
devoluciones
Función incorrecta
Si va a utilizar el método sugerido por David, también debería echar un vistazo al atributo [Flags].
Esto le permite realizar operaciones de bits en enumeraciones.
[Flags]
enum ExitCodes : int
{
Success = 0,
SignToolNotInPath = 1,
AssemblyDirectoryBad = 2,
PFXFilePathBad = 4,
PasswordMissing = 8,
SignFailed = 16,
UnknownError = 32
}
Entonces
(ExitCodes.SignFailed | ExitCodes.UnknownError)
sería 16 + 32. :)
Solo devuelve el código apropiado de main.
int main(string[] args)
{
return 0; //or exit code of your choice
}
Utilice ExitCode si su main tiene una firma de devolución nula, de lo contrario, debe "establecerla" según el valor que devuelva.
Si el método Main devuelve el valor nulo, puede usar esta propiedad para establecer el código de salida que se devolverá al entorno de llamada. Si Main no devuelve void, esta propiedad se ignora. El valor inicial de esta propiedad es cero.
System.Environment.ExitCode
int code = 2;
Environment.Exit( code );