C# 控制台应用程序:Main 方法 return 值 VS Application.ExitCode
C# console application: Main method return value VS Application.ExitCode
我正在为 windows 任务调度程序编写一个控制台程序到 运行。我的 Main()
方法有一个 return 类型的 int
并且我在退出时 return 不同的数字来指示执行结果,我可以在 .BAT
中访问它脚本为 %errorlevel%
.
但是在 VS2015 中调试时,我做了一个
return 255;
我总是从 VS2015 的输出 window 中得到:
The program '[43560] Foo.vshost.exe' has exited with code 0 (0x0).
现在,如果我想让输出 window 显示我程序的退出代码,我必须执行 Application.Exit(255)
才能显示
The program '[24400] Foo.vshost.exe' has exited with code 255 (0xff).
奇怪的是,如果我使用 return 语句或 Environment.Exit()
运行 CMD.exe
中的程序,%errorlevel%
会正确设置为 255。
所以我的问题是
Main()
的 return 值与 Environment.ExitCode
是否有些不同?
VS2015中如何轻松找出Main()
方法的return值?
退出控制台程序时,Environment.Exit()
是否优于简单的 return 语句?因为 return 语句更符合我的口味。
有人能告诉我这背后的故事吗?谢谢。
Is the return value of Main() somewhat different to Environment.ExitCode?
不,他们是一样的,去同一个地方。您可以通过试验仅 returns -1 或将 Environment.ExitCode
设置为 -1 的控制台应用程序来了解这一点。您会发现无论您使用哪种方法,都可以正确设置 %ERRORLEVEL%
。
What is the way to easily find out the return value of Main() method in VS2015?
首先,简要说明一下似乎正在发生的事情。下面是使用默认项目设置创建的控制台应用程序的堆栈跟踪:
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)
如果您查看 reference source 中 ThreadHelper.ThreadStart
的定义,您会看到它定义为:
internal void ThreadStart(object obj)
似乎这个 void return 被用作进程 return 值,或者它上面的其他方法之一正在消耗 return 值并吞下它。
如果您更改项目配置并禁用托管进程,那么您将得到如下输出:
The program '[7992] TestApp.exe' has exited with code -1 (0xffffffff).
如你所料。要禁用托管进程,请转到项目属性,然后在调试选项卡上,取消选中 "Enable the Visual Studio hosting process"
When exiting a console program, is Environment.Exit() preferred than a simple return statement? Because a return statement is more concise to my taste.
随心所欲。正如 Jeppe Stig 在评论中指出的那样,有关差异的更多信息,请参阅 Environment.Exit
的文档
我正在为 windows 任务调度程序编写一个控制台程序到 运行。我的 Main()
方法有一个 return 类型的 int
并且我在退出时 return 不同的数字来指示执行结果,我可以在 .BAT
中访问它脚本为 %errorlevel%
.
但是在 VS2015 中调试时,我做了一个
return 255;
我总是从 VS2015 的输出 window 中得到:
The program '[43560] Foo.vshost.exe' has exited with code 0 (0x0).
现在,如果我想让输出 window 显示我程序的退出代码,我必须执行 Application.Exit(255)
才能显示
The program '[24400] Foo.vshost.exe' has exited with code 255 (0xff).
奇怪的是,如果我使用 return 语句或 Environment.Exit()
运行 CMD.exe
中的程序,%errorlevel%
会正确设置为 255。
所以我的问题是
Main()
的 return 值与Environment.ExitCode
是否有些不同?VS2015中如何轻松找出
Main()
方法的return值?退出控制台程序时,
Environment.Exit()
是否优于简单的 return 语句?因为 return 语句更符合我的口味。
有人能告诉我这背后的故事吗?谢谢。
Is the return value of Main() somewhat different to Environment.ExitCode?
不,他们是一样的,去同一个地方。您可以通过试验仅 returns -1 或将 Environment.ExitCode
设置为 -1 的控制台应用程序来了解这一点。您会发现无论您使用哪种方法,都可以正确设置 %ERRORLEVEL%
。
What is the way to easily find out the return value of Main() method in VS2015?
首先,简要说明一下似乎正在发生的事情。下面是使用默认项目设置创建的控制台应用程序的堆栈跟踪:
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)
如果您查看 reference source 中 ThreadHelper.ThreadStart
的定义,您会看到它定义为:
internal void ThreadStart(object obj)
似乎这个 void return 被用作进程 return 值,或者它上面的其他方法之一正在消耗 return 值并吞下它。
如果您更改项目配置并禁用托管进程,那么您将得到如下输出:
The program '[7992] TestApp.exe' has exited with code -1 (0xffffffff).
如你所料。要禁用托管进程,请转到项目属性,然后在调试选项卡上,取消选中 "Enable the Visual Studio hosting process"
When exiting a console program, is Environment.Exit() preferred than a simple return statement? Because a return statement is more concise to my taste.
随心所欲。正如 Jeppe Stig 在评论中指出的那样,有关差异的更多信息,请参阅 Environment.Exit