Salut,
Je voulais faire un truc a priori assez simple, mais je suis tombé sur un os... Je veux lancer un process en définissant son ProcessStartInfo via une PropertyGrid. Rien de bien compliqué en principe, mais il y a à mon avis un gros bug dans le framework... quand je mets la propriété UseShellExecute à true, au lancement du process j'ai l'erreur suivante :
Or, je n'ai pas défini de variables d'environnement explicitement... Je me suis même assuré que la propriété EnvironmentVariables était une liste vide, mais ça ne suffit pas.InvalidOperationException : Pour utiliser des variables d'environnement, l'objet Process doit avoir une propriété UseShellExecute ayant la valeur false.
Pour essayer de comprendre le problème, j'ai regardé le code de Process et ProcessInfo avec Reflector. Voilà ce que j'ai trouvé :
- Cette exception est levée quand le champ (internal) environmentVariables de ProcessStartInfo est différent de null :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (startInfo.environmentVariables != null) { throw new InvalidOperationException(SR.GetString("CantUseEnvVars")); }
- Par défaut, à la création du ProcessStartInfo, ce champ est nul
- Il est initialisé dans le get de EnvironmentVariables, qui lui ajoute toutes les variables d'environnement du process en cours :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public StringDictionary EnvironmentVariables { get { if (this.environmentVariables == null) { this.environmentVariables = new StringDictionary(); // ... } return this.environmentVariables; } }
Quand la PropertyGrid affiche les données du ProcessStartInfo, elle fait appel à la propriété EnvironmentVariables, ce qui initialise environmentVariables. Et il n'y a plus moyen de remettre ce champ à null(la propriété est en lecture seule). Donc plus moyen de lancer un process avec ShellExecute
A mon avis, le test dans la classe process devrait plutôt tester si environmentVariables est null OU vide...
Pour ceux qui ont eu la patience de lire jusque là: auriez-vous une idée pour contourner le problème ?
Merci !
Partager