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
from
Main
,但我想像往常一样,选择完全取决于您。

这是对“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的问题。