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

MrD*_*ase 457 .net c# exit-code

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

The*_*edi 581

3个选项:

  • 您可以返回它Main,如果你申报你的Main方法来返回int.
  • 你可以打电话Environment.Exit(code).
  • 您可以使用以下属性设置退出代码:Environment.ExitCode = -1;.如果没有其他设置返回代码或使用上面的其他选项之一,将使用此方法).

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

  • @DannyBeckett按照惯例,退出代码"0"表示成功,非零表示失败.`return;`表示通过退出代码`0`成功,`return -1;`表示失败. (13认同)
  • 对于那些想知道为什么在它们的情况下不起作用的人,请确保您的项目编译为"控制台应用程序"而不是"Windows应用程序". (10认同)
  • 如果我有一个带有一些args的WinForms应用程序,我希望它作为一个控制台应用程序呢? (8认同)
  • 您还可以使用属性设置退出代码:Environment.ExitCode = -1; (5认同)
  • 你也可以只输入缅因程序作为int(用int替换void)并使用例如"return -1;" 从主程序返回.这比Environment.Exit()更具可移植性(取决于环境). (4认同)

Mar*_*ett 262

除了回答int的答案之外......还要求理智.请在枚举中定义退出代码,如果合适,请使用Flags.它使调试和维护变得更加容易(而且,作为奖励,您可以轻松地在帮助屏幕上打印退出代码 - 您确实有其中一个,对吧?).

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

int Main(string[] args) {
   return (int)ExitCode.Success;
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能想要添加,"成功"的值"0"不是偶然的,但实际上是该情况的"标准"值. (43认同)
  • 这个.这就是为什么SO是互联网历史上最伟大的网站.任何教科书都不能提供这种建议,只能通过与经验丰富的专业人士交谈来收集.谢谢. (39认同)
  • 你说0是成功的标准值,但是当将0/1转换为boolean时,0为false,1为真!可以更准确地说,退出代码0表示"无错误",而不是"成功",因为退出代码是ErrorResult而不仅仅是结果. (16认同)
  • 有关microsoft约定的完整列表,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx.有些人已经制作了一个巨大的竞争列表,并在下面的评论中用于切换案例中. (11认同)
  • @MarkShapiro,我猜`0 = Success`来自这样一个事实,即只需要一个成功代码,但许多错误代码,例如0,因为在计算机整数中没有+或 - ,可以用来唯一地标识成功 (5认同)
  • 我知道0是成功的标准.是否有其他退出代码的商定惯例或者它是否对所有人免费?(我认为这些是你在运行预定任务后得到的相同数字). (2认同)
  • 对不起,但帮助屏幕是什么? (2认同)

Sco*_*nro 46

您可以使用三种方法从控制台应用程序返回退出代码.

  1. 修改Main应用程序中的方法,使其返回int而不是void(返回Integer而不是SubVB.Net中的函数),然后返回该方法的退出代码.
  2. Environment.ExitCode属性设置为退出代码.请注意,方法1.优先 - 如果Main方法返回除void(Sub在VB.Net中)之外的任何内容,则将忽略此属性的值.
  3. 将退出代码传递给Environment.Exit方法.这将立即终止该过程,而不是其他两种方法.

应该遵守的一个重要标准是0代表"成功".

在相关主题上,请考虑使用枚举来定义应用程序要返回的退出代码.该的FlagsAttribute将允许您返回码的组合.

另外,请确保将您的应用程序编译为"控制台应用程序".

  • 这提出了一个有趣的观点。设置 `Environment.ExitCode` 不会立即关闭程序,但 `Environment.Exit` 方法会立即关闭程序 (2认同)
  • 退出代码也适用于 Windows 应用程序。如果应用程序是从 c# 启动的,通过 `Process` 对象,您可以向该对象询问 `WaitForExit()`,然后从中请求退出代码。 (2认同)

小智 43

如果您打算使用David建议的方法,您还应该查看[Flags]属性.

这允许您对枚举进行逐位操作.

[Flags]
enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}
Run Code Online (Sandbox Code Playgroud)

然后

(ExitCodes.SignFailed | ExitCodes.UnknownError)
Run Code Online (Sandbox Code Playgroud)

将是16 + 32. :)

  • 这意味着一个程序会说'你的密码错了'然后继续尝试签署它所签署的任何内容,并且只有在它失败时才停止.一旦失败,你应该回来; 其他任何事情都是警告,程序仍应返回0. (3认同)
  • 鲜为人知的事实是[Flags]无法启用或禁用按位操作.它只是覆盖ToString方法,以便输出表示按位标志.无论有没有它,您仍然可以进行按位操作. (3认同)
  • @Steven很高兴知道,但我仍然建议用该属性装饰用于"标志使用"的枚举,如果没有其他任何传达意图. (3认同)

pal*_*rse 24

int code = 2;
Environment.Exit( code );
Run Code Online (Sandbox Code Playgroud)

  • 为具有无意义名称的变量指定幻数不会减少魔法. (49认同)
  • 任何技术原因你不只是写"Environment.Exit(2);" ? (17认同)
  • @Blorgbeard - 你的两次评论之间已经过去了七年。这有点史诗般。:-D (3认同)
  • @Tornseglare 我期待着更新这一点。应该会在几个月内到来:) (3认同)

Est*_*aya 11

只需从main返回适当的代码即可.

int main(string[] args)
{
      return 0; //or exit code of your choice
}
Run Code Online (Sandbox Code Playgroud)

  • @Mark Lakta:然后改变它,不是吗? (18认同)
  • 默认的C#控制台应用程序根本不声明main.它声明`static void Main(string [] args);` (2认同)

cra*_*str 11

如果您的main具有void返回签名,请使用ExitCode,否则您需要使用返回的值"设置"它.

Environment.ExitCode属性

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


小智 8

作为Scott Munro 答案的更新:

  • 您关于 C# 6 的第一点可以得到验证吗?我似乎在网上找不到任何东西。Main 函数的返回值附加到进程的退出代码(至少在所有以前的编译器中),为什么他们应该改变这一点? (2认同)

Dav*_*vid 7

枚举选项非常好,但可以通过乘以数字来改进:

enum ExitCodes : int
{
  Success = 0,
  SignToolNotInPath = 1,
  AssemblyDirectoryBad = 2,
  PFXFilePathBad = 4,
  PasswordMissing = 8,
  SignFailed = 16,
  UnknownError = 32
}
Run Code Online (Sandbox Code Playgroud)

在出现多个错误的情况下,将特定错误号一起添加将为您提供一个唯一编号,表示检测到的错误的组合.

例如,错误级别6只能包含错误4和2,12只能包含错误4和8,14只能包含2,4和8等.

  • 也就是说,如果你在遇到一个错误后再费心去检查是否还有错误.大多数应用没有. (2认同)