Как приложение может получить доступ к переменной среды, установленной другим приложением? - PullRequest
4 голосов
/ 18 июня 2009

В этом случае приложение, которое устанавливает переменную среды, выполняется в / из приложения, которому требуется доступ к env.var. Возвращаемые значения Main () (Руководство по программированию в C #) В статье msdn обсуждается ее использование в пакетном файле. Если я попробую то же самое, все будет хорошо; но требуется запустить не из пакетного скрипта, а из приложения.

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

был явно неудачным. Process.Start заставил "приложение" работать в совершенно другой среде, я считаю. Другими словами, мне нужно запустить «приложение» в той же среде, что и приложение вызывающего, чтобы получить доступ к переменной среды, которую оно устанавливает.

Ответы [ 4 ]

6 голосов
/ 18 июня 2009

Если вы просто пытаетесь установить окружение ребенка от родителя:

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();

Если вы не хотите, чтобы ребенок наследовал среду родительского процесса:

var psi = new ProcessStartInfo();
psi.EnvironmentVariables["TEST_ENV"] = "From parent";
psi.UseShellExecute = false;
psi.FileName = @"C:\src\bin\Debug\ChildProc.exe";
Process.Start(psi);
1 голос
/ 18 июня 2009

Каждое приложение запускается со своей собственной копией среды, поэтому дочерний процесс не может влиять на среду родителя. Это верно вплоть до CreateProcess, где среда является входным / необязательным параметром, то есть односторонним.

Существует множество механизмов IPC, которые вы можете использовать от именованных каналов до сокетов, от общей памяти до файлов ... список можно продолжить.

Но есть подозрение, что файлы будут самыми легкими для вас.

Вы можете попросить дочерний процесс создать файл, содержащий пары имя / значение, которые вы хотите, чтобы вызывающее приложение могло затем загрузить и использовать. Формат может быть чем-то базовым, например:

ключ = значение key2 = значение2

немного сложнее (но, возможно, легче работать), например, XML ... или любой другой пользовательский формат, который вы хотите.

1 голос
/ 18 июня 2009

Переменные среды наследуются дочерним процессам, но каждый дочерний объект получает копию - если впоследствии вы измените среду родителя, это не отразится на дочернем процессе.

Это по соображениям безопасности: если переменные были общими, процессы могли видеть в памяти друг друга, что вызывало бы всевозможные проблемы.

Таким образом, решение состоит в том, чтобы установить переменную перед началом нового процесса.

Если вам нужно связаться с существующим дочерним процессом, используйте канал.

0 голосов
/ 18 октября 2017

Команда должна быть выполнена в среде текущего процесса. Обычно bash выполняет все процессы как дочерний процесс, которому дается копия родительской среды, доступная только для чтения, и создается новая запись всякий раз, когда переменная изменяется.

Точка (.) - это команда, которую не следует путать со спецификацией текущего каталога. Команда точка вызывает выполнение следующей команды в среде родителя. Таким образом, переменные среды процесса являются переменными среды вызывающего процесса.

...