El UseShellExecute
propiedad booleana se relaciona con el uso de las ventanas ShellExecute función vs la función CreateProcess - la respuesta corta es que si UseShellExecute
es cierto, entonces la clase Process
utilizará la función ShellExecute
, de lo contrario se utilizará CreateProcess
.
La respuesta más larga es que la función ShellExecute
se utiliza para abrir un programa o archivo específico - es más o menos equivalente a escribir el comando para ejecutar en el diálogo de ejecución y hacer clic en Aceptar, lo que significa que se puede usar (por ejemplo):
- Abrir.archivos html o en la web usando el navegador por defecto sin necesidad de saber lo que el navegador es,
- abrir un documento Word sin necesidad de conocer cuál es la ruta de instalación para Word es
- archivos de ejecución por lotes
- ejecutar cualquier comando en el
PATH
Por ejemplo:
es muy fácil de usar, versátil y potente, sin embargo viene con algunos inconvenientes:
- No es posible redireccionar se encarga de la entrada/salida/error estándar
- No es posible especificar los descriptores de seguridad (u otras cosas interesantes) para el proceso hijo
Hay una potencial de introducir vulnerabilidades de seguridad si hace suposiciones acerca de lo que realmente se llevará a cabo:
// 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();
CreateProcess
es una forma mucho más precisa de inicio de un proceso: no busca en la ruta y le permite redirigir la entrada o salida estándar del proceso hijo (entre otras cosas). La desventaja de CreateProcess
es que ninguno de los 4 ejemplos que di más arriba funcionará (pruébelo y vea).
En resumen, se debe configurar UseShellExecute
en false si:
- desea redirigir la entrada/salida/error estándar (esta es la razón más común)
- Usted no desea buscar la ruta para el ejecutable (por ejemplo, por razones de seguridad)
el contrario se debe mantener UseShellExecute
cierto si usted desea abrir documentos, URLs o archivos por lotes, etc ... en lugar de tener que renunciar explícitamente la ruta a un archivo ejecutable.
Great Stuff, pero usted escribe que (con ShellExecute): "Es [usted reclama] no es posible redirigir la los controles estándar de entrada/salida/error "<- Seguramente eso es incorrecto o inexacto. Incluso con useShellExecute establecido en true, mientras que de hecho no puede hacer 'processStartInfo.RedirectStandardOutput = true', me parece que todavía puede redirigir la salida estándar haciendo' process.Arguments = "cmd/c dir> c: \\ crp \\ aa "'. Del mismo modo, desde un cuadro de diálogo ejecutar puede hacer 'cmd/c dir> c: \ crp \ aa' – barlop
también, dice que cuando' UseShellExecute = false' es decir CreateProcess, no comprobará la ruta, pero veo que incluso cuando Hago "UseShellExecute = false", es decir, supuestamente no verificando la ruta, luego process.FileName = "cmd.exe" funciona, por lo que se comprueba c: \ windows \ system32. Y si copio cmd.exe en c: \ windows y lo llamo cmmmd.exe, entonces hago process1.FileName = "cmmmd.exe" que también funciona, así que está comprobando c: \ windows, así que parece que está verificando la ruta, o algunos grupos de directorios – barlop
Los documentos de MSDN coinciden con @barlop: "Cuando UseShellExecute es falso, la propiedad FileName puede ser una ruta totalmente calificada para el ejecutable, o un nombre ejecutable simple que el sistema intentará encontrar dentro de las carpetas especificadas por la variable de entorno PATH". – Bob