System.Diagnostics.Process UseShellExecute到底做了什么?

Bea*_*anz 25 c# msbuild

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

两个进程都启动时具有或多或少相同的结构:

waitProc.StartInfo.Arguments = "/C [executable]";
waitProc.StartInfo.FileName = "cmd.exe";
waitProc.StartInfo.UseShellExecute = false;
Run Code Online (Sandbox Code Playgroud)

此外,通过在xcopy命令中将"UseShellExecute"从false更改为true,我可以在两个用例中成功,但是命令无法在第三个用例中运行.第三个用例是我们的自动构建系统,它是一个直接调用msbuild的Windows服务.在我们的构建机器上发生故障的情况下,copy命令无限期挂起,我相信,因为System.Diagnostics.Process试图显示一个窗口,而服务没有与它们关联的Windows桌面会话,所以它们不能显示窗口.

我已经尝试使用"CreateNoWindow"属性,我已经尝试将"WindowStyle"设置为"ProcessWindowStyle.Hidden",但这并没有改变构建机器上的行为.

所有这些都说,我真正想知道的是UseShellExecute属性究竟是什么,因为它似乎比MSDN文档建议的要多得多.

谢谢.

Ree*_*sey 28

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

如果没有此设置,则只能直接执行EXE文件.通过设置此选项,您可以使用Windows Shell,从而允许指定.doc文件并让关联程序打开文件.

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

通常,cmd.exe除非您使用Windows Shell,否则使用是有问题的.您可能只想编写代码来直接处理"批处理"操作 - 即:使用System.IO命名空间中的类型方法进行复制.这将完全避免这个问题.

  • @Chris:"windows shell"基本上是资源管理器,在您实际登录时启动.不幸的是,这是构建机器上批处理文件的一个常见问题 - 我看到很多人都在努力解决这个问题,我已经转而只是直接用C#编写我的"脚本"来避免这个问题;) (4认同)