2009-06-18 13 views
3

Dans ce cas, l'application qui définit la variable d'environnement est exécutée dans/depuis l'application qui doit accéder à env.var. L'article msdn Main() Return Values (C# Programming Guide) explique 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.Comment une application peut-elle accéder à la variable d'environnement définie par une autre application?

Process.Start("app","args"); // app sets the env.var. 
string envVar = System.Environment.GetEnvironmentVariable("ERRORLEVEL"); 

était évidemment infructueuse. Process.Start a fait fonctionner "l'application" dans un environnement complètement différent, je crois. En d'autres termes, j'ai besoin d'exécuter "app" dans le même environnement que l'application appelant afin d'atteindre la variable d'environnement qu'il définit.

Répondre

5

Si vous êtes juste essayer 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 l'enfant d'hériter 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); 
+0

Toute personne se demandant où est la différence: Il s'agit de l'assignement d'un nouvel objet StartInfo au lieu d'utiliser celui prédéfini. – CSharpie

1

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 se reflétera pas dans l'enfant. C'est pour des raisons de sécurité: Si les variables étaient partagées, les processus pourraient voir dans la mémoire de l'autre 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 tube.

+0

Par conséquent, puis-je conclure que si l'enfant modifie une variable d'environnement, le parent ne sait pas, accède à la nouvelle valeur? – tafa

+0

Exactement. Les deux fonctionnent sur des copies individuelles. –

1

Chaque application s'exécute avec sa propre copie de l'environnement afin qu'un processus enfant ne puisse pas influencer l'environnement du parent. Cela 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 à partir de canaux nommés à des sockets à la mémoire partagée en fichiers ... la liste continue.

Mais le suspect que les fichiers vont être les plus faciles pour vous.

Vous pouvez demander au processus enfant de créer un fichier contenant les paires nom/valeur que l'application appelante peut charger et utiliser. Le format pourrait être quelque chose de base comme:

key = valeur key2 = valeur2

un peu plus complexe (mais peut-être plus facile de travailler avec) comme XML ... ou tout autre format personnalisé que vous souhaitez.

0

La commande doit être exécuté dans l'environnement du processus en cours. Normalement, bash exécutera tous les processus en tant que processus enfant qui reçoit une copie en lecture seule de l'environnement du parent et crée une nouvelle entrée chaque fois qu'une variable est modifiée.

Dot (.) Est une commande qui ne doit pas être confondue avec la spécification du répertoire courant. La commande dot 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.