124 votes

Quand devons-nous définir UseShellExecute sur True?

     //
    // 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 nous générons un nouveau processus, quand devons-nous définir UseShellExecute sur True?

188voto

Justin Points 42106

L' UseShellExecute propriété booléenne est lié à l'utilisation de la windows ShellExecute fonction de vs le CreateProcess fonction de la réponse courte est que si UseShellExecute qui est vrai, alors l' Process classe va utiliser l' ShellExecute de la fonction, sinon il utilisera CreateProcess.

La plus longue réponse, c'est que l' ShellExecute fonction est utilisée pour ouvrir un programme ou fichier - c'est à peu près equivalnt à la saisie de la commande à exécuter dans la boîte de dialogue exécuter et cliquez sur OK, ce qui signifie qu'il peut être utilisé pour (par exemple):

  • Ouvert .les fichiers html ou web en utilisant le navigateur par défaut sans avoir besoin de savoir quel est le navigateur,
  • Ouvrir un document word sans avoir besoin de savoir ce que le chemin d'installation de Word est
  • Exécuter des fichiers batch
  • Exécuter n'importe quelle commande sur le PATH

Par exemple:

Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();

Il est très facile pour l'utilisateur, polyvalent et puissant, cependant, est livré avec un certain nombre d'inconvénients:

  • Il n'est pas possible de rediriger l'entrée / sortie standard d'erreur / poignées
  • Il n'est pas possible de spécifier les descripteurs de sécurité (ou d'autres choses cool) pour le processus de l'enfant
  • Il est possible d'introduire des failles de sécurité si vous faites des hypothèses sur ce qui va réellement être exécuté:

    // 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 est une mesure plus précise de la façon de commencer un processus d' - il ne pas rechercher le chemin d'accès et vous permet de rediriger l'entrée standard ou la sortie de l'enfant du processus (entre autres choses). L'inconvénient de l' CreateProcess , cependant, est qu'aucun des 4 exemples que j'ai donnés ci-dessus ne fonctionne (essayez et vous verrez).

En résumé, vous devez définir UseShellExecute false (faux) si:

  • Vous souhaitez rediriger l'entrée standard / sortie / erreur (ce qui est la raison la plus courante)
  • Vous ne souhaitez pas rechercher le chemin d'accès de l'exécutable (par exemple, pour des raisons de sécurité)

Inversement, vous devriez conserver UseShellExecute vrai si vous voulez ouvrir des documents, des urls ou des fichiers batch, etc... plutôt que d'avoir à donner expressément le chemin d'accès à un fichier exécutable.

14voto

Bala R Points 57552

Je pense surtout aux non-exécutables. Par exemple, si vous essayez d’ouvrir un fichier .html, si vous devez définir UseShellExecute à true , le fichier .html sera ouvert dans un navigateur défini par défaut par le utilisateur.

11voto

Danny Chen Points 14781

À partir de MSDN:

La définition de cette propriété sur false permet vous rediriger l'entrée, la sortie, et erreur de flux.

UseShellExecute doit être faux si le nom d'utilisateur de la propriété n'est pas null ou une chaîne vide, ou un InvalidOperationException sera levée lorsque la Processus.Start(ProcessStartInfo) méthode est appelé.

Lorsque vous utilisez le système d'exploitation shell pour démarrer le processus, vous pouvez commencez tout document (ce qui est tout enregistré type de fichier associé un fichier exécutable qui a une ouverture par défaut d'action) et d'effectuer des opérations sur les fichier, telles que l'impression, avec le Composant de processus. Lorsque UseShellExecute est faux, vous pouvez démarrer uniquement les fichiers exécutables avec l' Composant de processus.

UseShellExecute doit être vrai si vous définir la ErrorDialog true à la propriété.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X