在C#控制台应用程序中退出

9

我在stackoverflow上阅读了很多内容,包括评论、意见和各种想法。但无论如何,我真的需要一种解释清晰的方法,在C#中退出我的控制台应用程序(我使用的是VS2010 Framework 4),并显示自定义错误。

我现在能找到的最好的方法是VB:

Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)

并使用ExitProcess(1)来处理错误或ExitProcess(0)。
所以我的问题是:
  • 和Environment.Exit(1)一样吗?
  • 对于作为自动作业运行的应用程序,哪个更好?
  • -1、0、1表示什么,它们有什么区别?
  • static void ExitProcess(uint uExitCode)是什么意思?
一些先前标记为参考文献的问题: C#中退出控制台应用程序的命令是什么? http://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx

1
在您链接的帖子中没有解释清楚您需要解释的内容是什么?static void ExitProcess(uint uExitCode)定义在哪里? - Dan Puzey
因为我发现有些页面说的不一样,还有其他错误代码。我找不到一个有用的MSDN页面,只有关于C++的,就像这个页面:http://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx 顺便说一下,我的代码定义在Program类中,其中包含静态void Main函数。 - Leandro Bardelli
1
Main 函数中只需返回一个整数,这将作为您的退出代码。 - SomeWritesReserved
你可能已经找到了一些不同的页面,但是在StackOverflow上已经有了你问题的答案,你应该期望那个答案就是StackOverflow上的“答案”。你不理解现有答案的哪些部分呢? - Dan Puzey
可能是重复的问题:C#中退出控制台应用程序的命令是什么? - Dan Puzey
显示剩余2条评论
6个回答

21

你可以:

  1. 调用 Environment.Exit(int)
  2. 将你的 Main 函数重新声明为返回 int,并从中返回值。

我看到了第二种解决方案,但我已经弃用它了,这对环境来说是确定的吗? - Leandro Bardelli
你说什么,你把它弃用了?这是一个完全可接受的解决方案,除非你有一个令人信服的理由不使用它。 - Servy

3

1) Environment.Exit 几乎相同,

2) 我猜是Windows自动化服务?你可以尝试,但我猜不会按预期工作...

3) 看这个:Windows Exitcodes

4) 这很好,但您也可以使用 .Net 内置的方法。


2
以下是使用Environment.Exit(ExitCode)时与您的问题相关的一些特定退出代码:
ERROR_SUCCESS
0 (0x0)
The operation completed successfully.
ERROR_INVALID_FUNCTION
1 (0x1)
Incorrect function.
ERROR_FILE_NOT_FOUND
2 (0x2)
The system cannot find the file specified.

如需更多详细的 ExitCodes,请参见此处http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx


2

Environment.Exit会执行与ExitProcess相同的操作(可能还有一些.NET清理工作)——最终结果是相同的。

至于退出代码,它们意味着任何您想要的东西(在合理范围内)- 0表示“成功”,!= 0表示“不成功”,但您可以使用任何非0值来表示任何您想要的意思,由使用该值的程序来对其执行有用的操作。


嗯,我现在明白为什么0永远不会改变,但其他的数字会改变了。我看到了很多例子,它们有不同的值。 - Leandro Bardelli
“它们的意思是你想要什么就是什么”这是一个糟糕的想法。如果你在使用Windows,那就使用Windows代码。这是工程师们期望得到的。如果你想要一个没有人能理解错误代码的应用程序,那就随便做吧。 - Dan

1
-1. 和 Environment.Exit(1) 一样吗? 这是 .NET,你几乎不可能知道他们实现了哪个 WINAPI,除非你用 windbg 查看内部。然而,关于 ExitProcess 和 Environment.Exit 的相似性没有任何文档记录。Environment.Exit 可能包含更多内容。
-2. 对于作为自动作业运行的应用程序来说,什么更好? 如果您正在使用某个调度程序运行自动化作业,那么我还有另一个想法,可以使用 Windows 服务代替。这将消除任何退出进程的麻烦。
-3. 退出代码 -1、0、1 是什么意思,它们之间有什么区别? 它们只是告诉操作系统退出的类型代码。您可能已经看到程序员在错误时指定 return 1 或成功时指定 return 0。这使您可以自由使用其中任何一个。
-4. 静态 void ExitProcess(uint uExitCode) 怎么样?

您可以在应用程序中使用未经管理的调用,但是您肯定会错过Environment.Exit所提供的管理活动。


0

我正在回答一个问题:“退出代码-1、0、1的含义及其区别是什么?”

不同的退出代码只是一种与调用应用程序进行状态通信的方法。 例如,在我参与的一个项目中,我们使用99作为警告代码。只要所有涉及的应用程序知道在收到99或其他内容时该做什么,就没问题。在该应用程序中,如果调用者接收到除0或99以外的任何其他值,调用者应该中止操作,在99的情况下则可以继续执行。


当您的应用程序无法启动并且Windows返回错误代码99时,您会怎么做?您未能正确执行。请停止认为这些数字毫无意义。也许您正在返回胡言乱语,但这并不意味着尝试使用您的应用程序的人总是从您那里获得错误。最好遵循此处找到的错误消息,有足够的空间供您自己的自定义消息:https://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接