我正在为windows任务调度程序编写一个控制台程序来运行。我的Main()方法有一个返回类型的int,我退出时返回不同的数字来指示执行的结果,我可以以%errorlevel%的形式在.BAT脚本中访问这个结果。
但是,在VS2015中调试时,我会执行
return 255;我总是从VS2015的输出窗口获得:
The program '[43560] Foo.vshost.exe' has exited with code 0 (0x0).现在,如果我希望输出窗口显示程序的退出代码,则必须执行Application.Exit(255)才能显示
The program '[24400] Foo.vshost.exe' has exited with code 255 (0xff).奇怪的是,如果我使用%errorlevel%语句或Environment.Exit()在CMD.exe中运行程序,则正确地将该程序设置为255。
所以我的问题是
Main()的返回值是否与Environment.ExitCode有些不同?Main()中方便地找到VS2015方法的返回值?Environment.Exit()比简单的返回语句更好吗?因为回执声明更符合我的口味。有人能告诉我这背后的故事吗?谢谢。
发布于 2016-06-13 12:40:15
Main()的返回值是否与Environment.ExitCode有些不同?
不,他们是一样的,去同一个地方。您可以通过尝试控制台应用程序来看到这一点,该应用程序只返回-1或将Environment.ExitCode设置为-1。您将看到,无论您使用哪种方法并正确设置%ERRORLEVEL%,都是正确的。
如何在VS2015中轻松地找到Main()方法的返回值?
首先,对正在发生的事情做一个简短的讨论。下面是使用默认项目设置创建的控制台应用程序的堆栈跟踪:
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宿主进程禁用后,堆栈跟踪(具有相同的选项)如下所示:
TestApp.exe!TestApp.Program.Main(string[] args)如果您查看ThreadHelper.ThreadStart在参考源中的定义,您将看到它被定义为:
internal void ThreadStart(object obj)似乎这种空返回被用作进程返回值,或者上面的其他方法之一正在消耗返回值并将其吞没。
如果您更改项目配置并禁用托管过程,那么您将得到如下输出:
The program '[7992] TestApp.exe' has exited with code -1 (0xffffffff).如你所料。若要禁用宿主进程,请转到项目属性,并在调试选项卡上取消选中“启用Visual宿主进程”
退出控制台程序时,Environment.Exit()是否优于简单的返回语句?因为回执声明更符合我的口味。
随便你喜欢哪种。正如Jeppe在评论中指出的,有关差异的更多信息,请参见Environment.Exit的文档。
https://stackoverflow.com/questions/37739755
复制相似问题