gpt4 book ai didi

c# - System.Diagnostics.Process UseShellExecute 究竟做了什么?

转载 作者:IT王子 更新时间:2023-10-29 04:21:58 24 4
gpt4 key购买 nike

我有一个 MSBuild 任务执行(除其他外)对 xcopy 的调用。我发现,当我从一个批处理文件运行我的 MSBuild 任务时,对 xcopy 的调用正确执行,并且无法执行或产生任何输出,这些输出让我知道当从另一个批处理文件调用同一个批处理文件时发生了什么带有 System.Diagnostics.Process 的 C# 应用程序。

两个进程都以大致相同的结构启动:

waitProc.StartInfo.Arguments = "/C [executable]";
waitProc.StartInfo.FileName = "cmd.exe";
waitProc.StartInfo.UseShellExecute = false;

此外,通过将 xcopy 命令上的“UseShellExecute”从 false 更改为 true,我可以在这两个用例中成功,但该命令在第三个用例中无法运行。第三个用例是我们的自动构建系统,它是一个直接调用 msbuild 的 Windows 服务。如果我们的构建机器出现故障,复制命令将无限期挂起,我相信这是因为 System.Diagnostics.Process 试图显示一个窗口,而服务没有与之关联的 Windows 桌面 session ,因此它们不能显示窗口。

我试过使用“CreateNoWindow”属性,我试过将“WindowStyle”设置为“ProcessWindowStyle.Hidden”,但这不会改变构建机器上的行为。

综上所述,我真正想知道的是 UseShellExecute 属性到底做了什么,因为它似乎比 MSDN 文档建议的要多得多。

谢谢。

最佳答案

ProcessStartInfo.UseShellExecute告诉进程使用 Windows Shell 来执行指定的应用程序。

没有这个设置,只能直接执行一个EXE文件。通过设置此项,您允许使用 Windows Shell,它允许执行诸如指定 .doc 文件和让相关程序打开该文件等操作。

但是,使用 Windows Shell 需要有效的桌面上下文,这就是您的第三个用例失败的原因。

一般来说,除非您使用的是 Windows Shell,否则使用 cmd.exe 是有问题的。您可能只想编写代码来直接处理您的“批处理”操作 - 即:使用 System.IO namespace 中类型的方法做你的复制。这将完全避免这个问题。

关于c# - System.Diagnostics.Process UseShellExecute 究竟做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2374153/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com