0

注意:我的电脑上启用了 Windows 沙盒。

Console.WriteLine(File.Exists(@"C:\Windows\system32\WindowsSandbox.exe"));
Console.WriteLine(new FileInfo(@"C:\Windows\system32\WindowsSandbox.exe").Exists);

运行上面的代码C# Interactive在(VS 不在管理员模式下)

True
True

但是,当我在控制台应用程序中运行它时,(管理员模式和非管理员模式)。结果总是错误的。

False
False

我试过Process.Start(@"C:\Windows\system32\WindowsSandbox.exe")了,控制台应用程序失败(管理员和非管理员),但 C# 交互成功。

在PowerShell中,C:\Windows\system32\WindowsSandbox.exe成功启动了Windows Sandbox。在资源管理器(system32 文件夹)中: 图像

谁能解释为什么会发生这种情况?

4

2 回答 2

3

文档中:

如果在尝试确定指定文件是否存在时发生任何错误,Exists 方法将返回 false。这可能发生在引发异常的情况下,例如传递包含无效字符或过多字符的文件名、磁盘故障或丢失,或者调用者没有读取文件的权限。

查看正在发生的事情的一种方法是尝试读取文件(例如使用 File.OpenRead)。如果成功,我会感到惊讶 - 但如果失败,异常应该会给你更多信息。还要从调用中检查运行命令时使用的身份(即cmd whoami等)

于 2020-04-01T07:01:24.383 回答
1

我不熟悉 Windows Sandbox,但听起来这是一个架构问题。

在 64 位 Windows 上,C:\Windows\system32是 64 位系统目录。C:\Windows\system32\WindowsSandbox.exe除非您特意运行 32 位版本,否则您说可以看到的 Explorer 和 PowerShell将是 64 位进程。

在 32 位应用程序中,路径C:\Windows\system32重定向到 32 位系统目录,C:\Windows\SysWOW64. 由于您说您没有C:\Windows\SysWOW64\WindowsSandbox.exe文件,并且您的应用程序也看不到(它认为是)C:\Windows\system32\WindowsSandbox.exe文件,这表明您的应用程序是针对 32 位构建的。

所以,问题是没有 32 位版本的Windows Sandbox32 位应用程序可以运行。当您更改路径calc.exenotepad.exe相同的代码工作时,因为 Windows 提供了这些可执行文件的 32 位和 64 位版本。要让您的应用程序运行 64-bit WindowsSandbox.exe,您可以...

  • 构建它以 64 位为目标,或者更好...
  • 让它执行路径C:\Windows\sysnative\WindowsSandbox.exesysnative是一个特殊别名,它允许 32 位应用程序引用本机(64 位)系统目录而无需重定向。

至于为什么 Visual Studio 能够看到C:\Windows\system32\WindowsSandbox.exe,我真的无法解释。这取决于您使用的版本,但据我了解,它仍然是 32 位应用程序,尽管某些组件是 64 位的。至于调试器等组件是否会以与操作系统或正在构建的应用程序相同的架构运行,我真的不知道。

于 2020-04-01T07:40:20.193 回答