Lio*_*hen 6 c# return-value exit-code main-method
我正在为Windows任务调度程序编写一个控制台程序来运行.我的Main()方法有一个返回类型,int并在退出时返回不同的数字以指示执行的结果,我可以在.BAT脚本中访问它%errorlevel%.
但是在VS2015中进行调试时,我会做一个
return 255;
Run Code Online (Sandbox Code Playgroud)
我总是从VS2015的输出窗口获取:
The program '[43560] Foo.vshost.exe' has exited with code 0 (0x0).
Run Code Online (Sandbox Code Playgroud)
现在,如果我希望"输出"窗口显示我的程序的退出代码,我必须Application.Exit(255)为其显示
The program '[24400] Foo.vshost.exe' has exited with code 255 (0xff).
Run Code Online (Sandbox Code Playgroud)
奇怪的是,%errorlevel%如果我CMD.exe使用return语句运行程序,则正确设置为255 Environment.Exit().
所以我的问题是
返回值Main()有些不同Environment.ExitCode吗?
Main()在VS2015中轻松找出方法返回值的方法是什么?
退出控制台程序时,是否Environment.Exit()比简单的返回语句更受欢迎?因为回报声明更符合我的口味.
有人能告诉我这背后的故事吗?谢谢.
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()
Run Code Online (Sandbox Code Playgroud)
请注意VS主机进程在那里.禁用VS主机进程后,堆栈跟踪(具有相同选项)如下所示:
TestApp.exe!TestApp.Program.Main(string[] args)
Run Code Online (Sandbox Code Playgroud)
如果你看一下定义ThreadHelper.ThreadStart的参考源你会看到它定义为:
internal void ThreadStart(object obj)
Run Code Online (Sandbox Code Playgroud)
似乎这个void返回被用作进程返回值,或者上面的其他方法之一是消耗返回值并吞下它.
如果您更改项目配置并禁用托管过程,那么您将获得如下输出:
The program '[7992] TestApp.exe' has exited with code -1 (0xffffffff).
Run Code Online (Sandbox Code Playgroud)
如你所料.要禁用托管过程,请转到项目属性,然后在调试选项卡上取消选中"启用Visual Studio托管过程"
退出控制台程序时,Environment.Exit()是否比简单的return语句更受欢迎?因为回报声明更符合我的口味.
无论你喜欢什么.正如Jeppe Stig在评论中所指出的,有关差异的更多信息,请参阅文档Environment.Exit
| 归档时间: |
|
| 查看次数: |
859 次 |
| 最近记录: |