【发布时间】:2010-09-14 09:53:39
【问题描述】:
我在 .NET 中有一个简单的控制台应用程序。它只是一个更大的应用程序的一个测试部分。我想指定我的控制台应用程序的“退出代码”。我该怎么做?
【问题讨论】:
我在 .NET 中有一个简单的控制台应用程序。它只是一个更大的应用程序的一个测试部分。我想指定我的控制台应用程序的“退出代码”。我该怎么做?
【问题讨论】:
int code = 2;
Environment.Exit( code );
【讨论】:
System.Environment.ExitCode
http://msdn.microsoft.com/en-us/library/system.environment.exitcode.aspx
【讨论】:
只需从 main 返回适当的代码。
int Main(string[] args)
{
return 0; //or exit code of your choice
}
【讨论】:
3 个选项:
Main方法返回int,你可以从Main返回它。Environment.Exit(code)。Environment.ExitCode = -1;。如果没有其他设置返回代码或使用上述其他选项之一,则将使用此选项)。根据您的应用程序(控制台、服务、Web 应用程序等),可以使用不同的方法。
【讨论】:
0 表示成功,非零表示失败。 return; 通过退出代码0 表示成功,return -1; 表示失败。
如果您的 main 有一个无效的返回签名,请使用 ExitCode,否则您需要通过您返回的值“设置”它。
如果 Main 方法返回 void,您可以使用此属性设置将返回给调用环境的退出代码。如果 Main 不返回 void,则忽略此属性。此属性的初始值为零。
【讨论】:
除了涵盖 return int 的答案之外......呼吁理智。请在枚举中定义您的退出代码,如果合适,请使用标志。它使调试和维护变得如此容易(而且,作为奖励,您可以轻松地在帮助屏幕上打印出退出代码 - 您确实拥有其中一个,对吧?)。
enum ExitCode : int {
Success = 0,
InvalidLogin = 1,
InvalidFilename = 2,
UnknownError = 10
}
int Main(string[] args) {
return (int)ExitCode.Success;
}
【讨论】:
0 = Success 来自这样一个事实,即只需要一个成功代码,但是许多错误代码,例如 0,在计算机整数中没有 + 或 - 可以是用于唯一标识成功
枚举选项非常好,但是可以通过将数字相乘来改进,如下所示:
enum ExitCodes : int
{
Success = 0,
SignToolNotInPath = 1,
AssemblyDirectoryBad = 2,
PFXFilePathBad = 4,
PasswordMissing = 8,
SignFailed = 16,
UnknownError = 32
}
在出现多个错误的情况下,将特定错误编号相加将为您提供一个唯一编号,该编号代表检测到的错误的组合。
例如,errorlevel 6 只能由error 4 和2 组成,12 只能由error 4 和8 组成,14 只能由2、4 和8 组成等等。
【讨论】:
如果你打算使用 David 建议的方法,你还应该看看 [Flags] 属性。
这允许您对枚举执行按位操作。
[Flags]
enum ExitCodes : int
{
Success = 0,
SignToolNotInPath = 1,
AssemblyDirectoryBad = 2,
PFXFilePathBad = 4,
PasswordMissing = 8,
SignFailed = 16,
UnknownError = 32
}
然后
(ExitCodes.SignFailed | ExitCodes.UnknownError)
应该是 16 + 32。:)
【讨论】:
您可以使用三种方法从控制台应用程序返回退出代码。
Main 方法,使其返回int 而不是void(该函数在VB.Net 中返回Integer 而不是Sub),然后返回退出代码从那个方法。Main 方法返回 void 以外的任何值(在 VB.Net 中是 Sub),则此属性的值将被忽略。应遵守的一个重要标准是0 代表“成功”。
在相关主题中,考虑使用枚举来定义您的应用程序将要返回的退出代码。 FlagsAttribute 将允许您返回代码组合。
另外,请确保您的应用程序被编译为“控制台应用程序”。
【讨论】:
Environment.ExitCode 不会立即关闭程序,但Environment.Exit 方法会立即关闭程序
Process对象,您可以向WaitForExit()请求对象,然后向它请求退出代码。
我的 2 美分:
您可以在此处找到系统错误代码: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx
您会发现典型的代码,例如“找不到文件”的 2 或“拒绝访问”的 5。
当你偶然发现一个未知代码时,你可以使用这个命令来找出它的含义:
net helpmsg decimal_code
例如
net helpmsg 1
返回
函数不正确
【讨论】:
作为 Scott Munro 的 answer 的更新:
Main 的返回类型无效。main 入口点的返回值受到尊重。【讨论】:
Main() 返回我的结果/错误代码并没有设置调用应用程序所看到的Process.ExitCode。
int Main 仍然可以用作 Environment.ExitCode 的替代品。 link
使用此代码
Environment.Exit(0);
如果您不想返回任何内容,请使用 0 作为 int。
【讨论】:
只是另一种方式:
public static class ApplicationExitCodes
{
public static readonly int Failure = 1;
public static readonly int Success = 0;
}
【讨论】:
我就是这么干的
int exitCode = 0;
Enviroment.Exit(exitCode);
或者你可以抛出错误(个人喜好)
throw new ArgumentException("Code 0, Enviroment Exit");
我选择了 ArgumentException,但您可以输入其他。它会正常工作的。
【讨论】: