C# 返回语句和Environment.ExitCode返回值的差异
我正在玩控制台的返回值,我看到了一些有趣的东西。差异来自于:C# 返回语句和Environment.ExitCode返回值的差异,c#,C#,我正在玩控制台的返回值,我看到了一些有趣的东西。差异来自于: static void Main(string[] args) { Environment.ExitCode = 4; } 及 ? 如果我同时使用: static int Main(string[] args) { Environment.ExitCode = 4; return 10; } 然后退出代码: 在命令行中总是:10, 在visual studio中是:4, 从禁用托管进程的visual stu
static void Main(string[] args)
{
Environment.ExitCode = 4;
}
及
?
如果我同时使用:
static int Main(string[] args)
{
Environment.ExitCode = 4;
return 10;
}
然后退出代码:在命令行中总是:10,
在visual studio中是:4,
从禁用托管进程的visual studio,它是:10。
问题:
这两种设置退出代码的方法有什么不同?哪一种被认为是最适合使用的方法?各州的文档: 如果Main方法返回void,则可以使用此属性设置 将返回到调用环境的退出代码。如果主要 不返回void,将忽略此属性。初始值 这个属性是零 因此,在您的情况下,您的
main
返回一个int
,这意味着不应该真正使用Environment.ExitCode
(文档说明它显然将被忽略)。如果您的main
正在返回void
,则Environment.ExitCode
将按预期运行
当您使用带有
int main()
方法的Environment.ExitCode
时,使用调试器运行时可能会产生奇怪的结果?根据Microsoft的说法:
如果Main方法返回void,则可以使用此属性设置
将返回到调用环境的退出代码。如果主要
不返回void,将忽略此属性。初始值
这个属性是零
参考资料
我个人更喜欢使用
return
fromMain
,但我想像往常一样,选择完全取决于您。这是对“vshost.exe”在这种情况下所产生的差异的回应
vshost.exe
进程使用Assembly.ExecuteAssembly()
启动原始可执行文件,这反过来又是“程序集入口点返回的值”
但是,vshost.exe可执行文件的(生成的)Main方法不返回int,而是void。也就是说,它忽略由ExecuteAssembly
返回的值
例如,从概念上看,它不是这样的:
class VsHost
{
public static int Main(string[] args) {
// ...
return appDomain.ExecuteAssembly("true.exe", ...);
}
}
class VsHost
{
public static void Main(string[] args) {
// ...
appDomain.ExecuteAssembly("true.exe", ...);
// Nothing here...
}
}
而是像这样:
class VsHost
{
public static int Main(string[] args) {
// ...
return appDomain.ExecuteAssembly("true.exe", ...);
}
}
class VsHost
{
public static void Main(string[] args) {
// ...
appDomain.ExecuteAssembly("true.exe", ...);
// Nothing here...
}
}
因此,基本上,当它退出时,唯一设置的退出代码是“真实”可执行文件中的Environment.ExitCode
提供的代码。请注意,ExitCode
是全局值,与设置它的AppDomain无关
您可以使用第三个示例和以下“vshost mock”轻松测试此行为:
然后运行以下命令:
C:\> VsHostMock.exe ; echo %ERRORLEVEL%
ReturnCode: 5
Environment.ExitCode: 4
然后运行:
C:\> echo %ERRORLEVEL%
4
在第三个示例中,应该忽略来自msdn的,因为您有一个非void
Main
。所以这是vshost的问题。