如何在.NET中指定控制台应用程序的退出码?

我在. net中有一个简单的控制台应用程序。这只是一个更大应用程序的测试部分。我想指定控制台应用程序的“退出代码”。我怎么做呢?

375404 次浏览
int code = 2;
Environment.Exit( code );
System.Environment.ExitCode

看到# EYZ0。

只需从main返回相应的代码。

int Main(string[] args)
{
return 0; // Or exit code of your choice
}

三个选项:

  • 如果您声明Main方法返回int,则可以从Main返回它。
  • 您可以调用Environment.Exit(code)
  • 您可以使用属性Environment.ExitCode = -1;来设置退出代码。如果没有其他设置返回代码或使用上面的其他选项之一,将使用此选项)。

根据您的应用程序(控制台、服务、web应用程序等),可以使用不同的方法。

如果你的main有一个无效返回签名,使用ExitCode。否则,您需要“设置”;它由你返回的值决定。

从# EYZ0:

如果Main方法返回void,则可以使用此属性设置将返回到调用环境的退出代码。如果Main不返回void,则忽略此属性。这个属性的初始值为零。

除了包含返回int的答案之外…这是对理智的恳求。请,请在枚举中定义您的退出代码,如果合适的话,请标记。它使调试和维护变得更加容易(而且,作为奖励,您可以轻松地在帮助屏幕上打印出退出代码——您确实有一个退出代码,对吧?)

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


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

枚举选项非常棒。但是,可以通过将数字相乘来改进:

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

在出现多个错误的情况下,将特定的错误数字加在一起将得到一个表示检测到的错误组合的唯一数字。

例如,错误级别6只能由错误4和错误2组成,12只能由错误4和错误8组成,14只能由错误2、错误4和错误8组成,等等。

如果你打算使用大卫建议的方法,你还应该看一下[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。:)

有三种方法可用于从控制台应用程序返回退出代码。

  1. 修改应用程序中的Main方法,使其返回int而不是void(一个返回Integer而不是VB。网中的Sub的函数),然后返回该方法的退出代码。
  2. 环境。ExitCode属性设置为退出代码。注意方法1。优先-如果Main方法返回的不是void(在VB.Net中是Sub),那么这个属性的值将被忽略。
  3. 将退出代码传递给环境。退出方法。与其他两种方法相反,这将立即终止流程。

需要注意的一个重要标准是,0代表“成功”。

在相关主题中,考虑使用枚举定义应用程序将返回的退出代码。FlagsAttribute将允许您返回代码的组合。

此外,确保您的应用程序被编译为“控制台应用程序”。

作为斯科特·门罗的回答的更新:

使用这段代码

Environment.Exit(0);

如果你不想返回任何东西,就使用0作为int。

换一种说法:

public static class ApplicationExitCodes
{
public static readonly int Failure = 1;
public static readonly int Success = 0;
}

我这样做:

int exitCode = 0;
Environment.Exit(exitCode);

或者你可以抛出一个错误(个人偏好):

throw new ArgumentException("Code 0, Environment Exit");

我选择了ArgumentException,但你可以输入other。它会工作得很好。