2011-03-10 9 views
91
// 
    // Summary: 
    //  Gets or sets a value indicating whether to use the operating system shell 
    //  to start the process. 
    // 
    // Returns: 
    //  true to use the shell when starting the process; otherwise, the process is 
    //  created directly from the executable file. The default is true. 
    [DefaultValue(true)] 
    [MonitoringDescription("ProcessUseShellExecute")] 
    [NotifyParentProperty(true)] 
    public bool UseShellExecute { get; set; } 

Si generamos un nuevo proceso, ¿cuándo debemos establecer UseShellExecute en True?¿Cuándo debemos establecer UseShellExecute en True?

Respuesta

132

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.

+1

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

+3

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

+0

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

9

De MSDN:

se establece esta propiedad en false permite redirigir la entrada, salida, y corrientes de error.

UseShellExecute debe ser falsa si la propiedad nombre de usuario no es nulo o una cadena vacía, o un InvalidOperationException será produce cuando el método Process.Start (ProcessStartInfo) se llama.

Cuando se utiliza el sistema operativo shell para iniciar procesos, puede de empezar cualquier documento (es decir, cualquier tipo fichero registrado asociado con un ejecutable que tiene una abierta acción por defecto) y realizar operaciones en el archivo , como la impresión, con el componente de proceso . Cuando UseShellExecute es falso, puede iniciar solo ejecutables con el componente de proceso .

UseShellExecute debe ser verdadero si establece la propiedad ErrorDialog en verdadero.

11

Creo que principalmente para los no ejecutables. Por ejemplo, si está intentando abrir un archivo .html, tendrá que establecer UseShellExecute en true y eso abrirá .html en un navegador que el usuario haya configurado como predeterminado.

0

Si queremos ocultar la ventana ejecutable actual aplicación, entonces UseShellExecute se debe establecer en cierto

Cuestiones relacionadas