Как приложение может получить доступ к переменной среды, установленной другим приложением?

StackOverflow https://stackoverflow.com/questions/1013383

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

Но подозреваю, что файлы будут для вас проще всего.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top