La UseShellExecutepropiedad booleana está relacionada con el uso de la función ShellExecute de Windows frente a la función CreateProcess : la respuesta corta es que si UseShellExecutees verdadero, la Processclase usará la ShellExecutefunción; de lo contrario, la usará CreateProcess.
La respuesta más larga es que la ShellExecutefunción se usa para abrir un programa o archivo específico; es aproximadamente equivalente a escribir el comando que se ejecutará en el cuadro de diálogo de ejecución y hacer clic en Aceptar, lo que significa que se puede usar para (por ejemplo):
- Abra archivos .html o web utilizando el navegador predeterminado sin necesidad de saber qué es ese navegador,
- Abra un documento de Word sin necesidad de saber cuál es la ruta de instalación de Word
- Ejecute cualquier comando en el
PATH
Por ejemplo:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
Es muy fácil de usar, versátil y potente, sin embargo, tiene algunos inconvenientes:
No es posible redirigir los controladores estándar de entrada / salida / error
No es posible especificar descriptores de seguridad (u otras cosas interesantes) para el proceso secundario
Existe la posibilidad de introducir vulnerabilidades de seguridad si hace suposiciones sobre lo que realmente se ejecutará:
// If there is an executable called "notepad.exe" somewhere on the path
// then this might not do what we expect
p.StartInfo.FileName = "notepad.exe";
p.Start();
CreateProcesses una forma mucho más precisa de iniciar un proceso: no busca la ruta y le permite redirigir la entrada o salida estándar del proceso secundario (entre otras cosas). CreateProcessSin embargo, la desventaja es que ninguno de los 3 ejemplos que di anteriormente funcionará (pruébelo y vea).
En resumen, debe establecer UseShellExecuteen falso si:
- Desea redirigir la entrada / salida / error estándar (esta es la razón más común)
- No desea buscar la ruta del ejecutable (por ejemplo, por razones de seguridad)
Por el contrario, debe mantenerse UseShellExecutefiel si desea abrir documentos, URL o archivos por lotes, etc., en lugar de tener que dar explícitamente la ruta a un ejecutable.
processStartInfo.RedirectStandardOutput=true, me parece que aún puede redirigir la salida estándar al hacerloprocess.Arguments= "cmd /c dir >c:\\crp\\a.a". Del mismo modo, desde un cuadro de diálogo de ejecución que puede hacercmd /c dir>c:\crp\a.a