首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#控制台应用程序:主方法返回值与Application.ExitCode

C#控制台应用程序:主方法返回值与Application.ExitCode
EN

Stack Overflow用户
提问于 2016-06-10 04:12:15
回答 1查看 2.4K关注 0票数 7

我正在为windows任务调度程序编写一个控制台程序来运行。我的Main()方法有一个返回类型的int,我退出时返回不同的数字来指示执行的结果,我可以以%errorlevel%的形式在.BAT脚本中访问这个结果。

但是,在VS2015中调试时,我会执行

代码语言:javascript
复制
return 255;

我总是从VS2015的输出窗口获得:

代码语言:javascript
复制
The program '[43560] Foo.vshost.exe' has exited with code 0 (0x0).

现在,如果我希望输出窗口显示程序的退出代码,则必须执行Application.Exit(255)才能显示

代码语言:javascript
复制
The program '[24400] Foo.vshost.exe' has exited with code 255 (0xff).

奇怪的是,如果我使用%errorlevel%语句或Environment.Exit()CMD.exe中运行程序,则正确地将该程序设置为255。

所以我的问题是

  1. Main()的返回值是否与Environment.ExitCode有些不同?
  2. 如何在Main()中方便地找到VS2015方法的返回值?
  3. 当退出控制台程序时,Environment.Exit()比简单的返回语句更好吗?因为回执声明更符合我的口味。

有人能告诉我这背后的故事吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-13 12:40:15

Main()的返回值是否与Environment.ExitCode有些不同?

不,他们是一样的,去同一个地方。您可以通过尝试控制台应用程序来看到这一点,该应用程序只返回-1或将Environment.ExitCode设置为-1。您将看到,无论您使用哪种方法并正确设置%ERRORLEVEL%,都是正确的。

如何在VS2015中轻松地找到Main()方法的返回值?

首先,对正在发生的事情做一个简短的讨论。下面是使用默认项目设置创建的控制台应用程序的堆栈跟踪:

代码语言:javascript
复制
TestApp.exe!TestApp.Program.Main(string[] args)
[Native to Managed Transition]
[Managed to Native Transition]
mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args)
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state)
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()

注意,VS主机进程就在那里。当VS宿主进程禁用后,堆栈跟踪(具有相同的选项)如下所示:

代码语言:javascript
复制
TestApp.exe!TestApp.Program.Main(string[] args)

如果您查看ThreadHelper.ThreadStart参考源中的定义,您将看到它被定义为:

代码语言:javascript
复制
internal void ThreadStart(object obj)

似乎这种空返回被用作进程返回值,或者上面的其他方法之一正在消耗返回值并将其吞没。

如果您更改项目配置并禁用托管过程,那么您将得到如下输出:

代码语言:javascript
复制
The program '[7992] TestApp.exe' has exited with code -1 (0xffffffff).

如你所料。若要禁用宿主进程,请转到项目属性,并在调试选项卡上取消选中“启用Visual宿主进程”

退出控制台程序时,Environment.Exit()是否优于简单的返回语句?因为回执声明更符合我的口味。

随便你喜欢哪种。正如Jeppe在评论中指出的,有关差异的更多信息,请参见Environment.Exit的文档。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37739755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档