Comment une application peut-elle accéder à la variable d'environnement définie par une autre application?
-
06-07-2019 - |
Question
Dans ce cas, l'application qui définit la variable d'environnement est exécutée dans / à partir de l'application devant accéder à env.var. Principales valeurs de retour (Guide de programmation C #) msdn décrit son utilisation dans un fichier batch. Si j'essaye la même chose, tout va bien; mais ce qui est requis est de ne pas exécuter à partir d'un script batch, mais à partir d'une application.
Process.Start("app","args"); // app sets the env.var.
string envVar = System.Environment.GetEnvironmentVariable("ERRORLEVEL");
a visiblement échoué. Process.Start a créé l'application " app " travailler dans un environnement complètement différent, je crois. En d'autres termes, je dois exécuter l'application " app " dans le même environnement que l’appelant afin d’atteindre la variable d’environnement définie.
La solution
Si vous essayez simplement de définir l'environnement de l'enfant du parent:
var p = new Process();
p.StartInfo.EnvironmentVariables["TEST_ENV"] = "From parent";
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = @"C:\src\bin\Debug\ChildProc.exe";
p.Start();
Si vous ne voulez pas que l'enfant hérite de l'environnement de processus parent:
var psi = new ProcessStartInfo();
psi.EnvironmentVariables["TEST_ENV"] = "From parent";
psi.UseShellExecute = false;
psi.FileName = @"C:\src\bin\Debug\ChildProc.exe";
Process.Start(psi);
Autres conseils
Les variables d'environnement sont héritées des processus enfants, mais chaque enfant en reçoit une copie. Si vous modifiez l'environnement du parent par la suite, cela ne sera pas reflété dans l'enfant.
C’est pour des raisons de sécurité: si les variables étaient partagées, les processus pouvaient se visualiser mutuellement, ce qui causerait toutes sortes de problèmes.
La solution consiste donc à définir la variable avant de lancer le nouveau processus.
Si vous devez communiquer avec un processus enfant existant, utilisez un canal.
Chaque application s'exécute avec sa propre copie de l'environnement, de sorte qu'un processus enfant ne peut pas influencer l'environnement du parent. Ceci est vrai jusqu’à CreateProcess où l’environnement est un paramètre d’entrée / facultatif - c’est-à-dire unidirectionnel.
Il existe de nombreux mécanismes IPC disponibles, des canaux nommés aux sockets, en passant par la mémoire partagée vers les fichiers ... la liste est longue.
Mais le suspect que les fichiers vont être le plus facile pour vous.
Vous pourriez demander au processus enfant de créer un fichier contenant les paires nom / valeur souhaitées que l'application appelante pourrait ensuite charger et utiliser. Le format pourrait être quelque chose de base comme:
clé = valeur clé2 = valeur2
un peu plus complexe (mais peut-être plus facile à utiliser) comme XML ... ou tout format personnalisé que vous voulez.
La commande doit être exécutée dans l'environnement du processus en cours. Normalement, bash exécutera tous les processus en tant que processus enfant, auquel une copie en lecture seule de l'environnement du parent sera créée, et créera une nouvelle entrée chaque fois qu'une variable sera modifiée.
Dot (.) est une commande à ne pas confondre avec la spécification du répertoire en cours. La commande point entraîne l'exécution de la commande suivante dans l'environnement du parent. De cette manière, les variables d’environnement du processus sont les variables d’environnement du processus appelant.