响应“vshost.exe”在这种情况下产生的差异。
vshost.exe 进程使用Assembly.ExecuteAssembly() 启动原始可执行文件,而documented 又是“程序集入口点返回的值”。
但是,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...
}
}
因此,基本上,当它退出时,唯一设置的退出代码是Environment.ExitCode 在“真实”可执行文件中提供的退出代码。请注意,ExitCode 是全局值,与设置它的 AppDomain 无关。
您可以使用第三个示例和以下“vshost-mock”轻松测试此行为:
// Compile to "Example3.exe"
using System;
class Example3
{
public static int Main(string[] args) {
Environment.ExitCode = 4;
return 5;
}
}
// Complile to "VsHostMock.exe"
using System;
class VsHostMock
{
public static void Main(string[] args) {
var appDomain = AppDomain.CreateDomain("other");
int returnCode = appDomain.ExecuteAssembly("Example3.exe");
Console.WriteLine("ReturnCode: {0}", returnCode);
Console.WriteLine("Environment.ExitCode: {0}", Environment.ExitCode);
}
}
然后运行以下命令:
C:\> VsHostMock.exe ; echo %ERRORLEVEL%
ReturnCode: 5
Environment.ExitCode: 4
然后运行:
C:\> echo %ERRORLEVEL%
4