System.Diagnostics.ProcessUseShellExecute到底是做什么的?我有一个MSBuild任务(除其他外)调用xcopy。我发现当我从批处理文件运行MSBuild任务时,对xcopy的调用正确执行并且无法执行或生成任何输出,这些输出会让我知道从另一个使用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桌面会话,所以它们无法显示窗口。我试过使用“CreateNoWindow”属性,我试过将“WindowStyle”设置为“ProcessWindowStyle.Hidden”,但这并没有改变构建机器上的行为。综上所述,我真正想知道的是UseShellExecute属性实际上是什么,因为它似乎比MSDN文档所建议的要多得多。谢谢。ProcessStartInfo.UseShellExecute告诉进程使用WindowsShell来执行指定的应用程序。如果没有这个设置,只能直接执行EXE文件。通过设置此选项,您可以使用WindowsShell,它允许指定一个.doc文件并让关联的程序打开该文件。但是,使用WindowsShell需要有效的桌面上下文,这就是您的第三个用例失败的原因。一般而言,除非您使用的是WindowsShell,否则您在使用cmd.exe时会遇到问题。您可能只想编写代码来直接处理“批处理”操作——即:使用System.IO命名空间中的类型方法进行复制。这完全避免了这个问题。来自文档:将此属性设置为false可启用输入、输出和错误流的重定向。注意:如果UserName属性不是空引用(在VisualBasic中为Nothing)或空字符串,则UseShellExecute必须为false,否则在调用Process.Start(ProcessStartInfo)方法时将抛出InvalidOperationException。使用操作系统shell启动进程时,您可以启动任何文档(与具有默认打开操作的可执行文件关联的任何已注册文件类型)并使用Process组件对文件执行操作(例如打印)。当UseShellExecute为false时,您只能使用Process组件启动可执行文件。注意:如果ErrorDialog属性设置为true,则UseShellExecute必须为true。当UseShellExecute为真时,WorkingDirectory属性的行为与UseShellExecute为假时不同。当UseShellExecute为真时,WorkingDirectory属性指定可执行文件的位置。如果WorkingDirectory是空字符串,则当前目录被理解为包含可执行文件。当UseShellExecute为false时,WorkingDirectory属性不用于查找可执行文件。相反,它由启动的进程使用,并且仅在新进程的上下文中才有意义。使用“UseShellExecute”IIRC是为了让资源管理器(主shell)执行进程而不是.NET运行时......除非有人纠正我错误......你是否正确指定了WorkingDirectory?您可以通过添加>c:log.txt2>c:err.txt查看命令的实际输出。运行此添加并检查这些文件以上是C#学习教程:System.Diagnostics.ProcessUseShellExecute到底是做什么的?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
