title: What exactly does System.Diagnostics.Process UseShellExecute do?
body: <p>I have an MSBuild task that executes (among other things) a call to xcopy. What I have found is that this call to xcopy executes correctly when I run my MSBuild task from a batch file, and fails to execute or produce any output that would allow me any idea what is going on when that same batch file is called from another C# application with a System.Diagnostics.Process.</p>
  
  <p>Both processes are launched with more or less the same structure:</p>
  
  <pre><code>waitProc.StartInfo.Arguments = "/C [executable]";
  waitProc.StartInfo.FileName = "cmd.exe";
  waitProc.StartInfo.UseShellExecute = false;
  </code></pre>
  
  <p>Furthermore by changing the "UseShellExecute" from false to true on the xcopy command I can make this succeed in both use cases, however the command fails to run in a third use case. The third use case being our automated build system which is a windows service calling msbuild directly. In the case of the failure on our build machine the copy command hangs indefinitely which is, I believe, because the System.Diagnostics.Process tries to display a window, and services do not have a Windows desktop session associated with them, so they cannot display windows.</p>
  
  <p>I have tried using the "CreateNoWindow" property, and I've tried setting the "WindowStyle" to "ProcessWindowStyle.Hidden," but that does not change the behavior on the build machine.</p>
  
  <p>All of this said, what I really want to know is what exactly the UseShellExecute property does, because it seems to do a whole lot more than the MSDN documentation suggests.</p>
  
  <p>Thanks.</p>