2017-01-03 1 views
1

Я запускаю дочерний процесс из родительского процесса, используя Process.Start(). В дочернем процессе создать новую переменную, призывающуюКак отправить сообщение от дочернего к родительскому процессу с использованием переменной среды в C#?

Environment.SetEnvironmentVariable("MessageKey", "MessageValue"); После выхода из дочернего процесса я хочу прочитать вышеупомянутую переменную из родительского процесса с использованием

var env = childProcess.StartInfo.EnvironmentVariables; 
string MessageValue = env["MessageKey"]; 

переменная отсутствует. Как отправить сообщение от дочернего к родительскому процессу с использованием переменной среды в C#?

+1

Это не будет работать. Для этого используйте соответствующие IPC-методы. http://stackoverflow.com/questions/528652/what-is-the-simplest-method-of-inter-process-communication-between-2-c-sharp-pro – OldProgrammer

ответ

2

Environment.SetEnvironmentVariable создает, изменяет или удаляет переменную окружения, хранящуюся в текущем процессе или в разделе реестра операционной системы Windows, зарезервированном для текущего пользователя или локальной машины. Метод SetEnvironmentVariable(String, String,EnvironmentVariableTarget) позволяет определить переменную среды, доступную для всех процессов, выполняющихся на машине (значение параметра EnvironmentVariableTarget.Machine), ко всем процессам, выполняемым пользователем (значение EnvironmentVariableTarget.User) или текущему процессу (Значение процесса). Переменные среды для каждого компьютера и каждого пользователя копируются в блок среды текущего процесса. Однако переменные среды, которые являются уникальными для текущего блока процессов, сохраняются только до тех пор, пока процесс не завершится.

Environment.GetEnvironmentVariable извлекает значение переменной среды из текущего процесса или из раздела реестра операционной системы Windows для текущего пользователя или локальной машины.

EnvironmentVariableTarget указывает местоположение, в котором переменная среды хранится или извлекается в наборе или выполняется операция.

  1. Машина: Переменная среды хранится или извлекается из HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Key Manager \ окружающей среды в реестре операционной системы Windows.
  2. Процесс: переменная среды сохраняется или извлекается из блока среды, связанного с текущим процессом.
  3. Пользователь: переменная среды хранится или извлекается из ключа HKEY_CURRENT_USER \ Environment в реестре операционной системы Windows.

Таким образом, вы можете использовать

Environment.SetEnvironmentVariable("MessageKey", "MessageValue", EnvironmentVariableTarget.Machine); 

и

Environment.GetEnvironmentVariable("MessageKey", EnvironmentVariableTarget.Machine); 
+1

без перезапуска родителя? возможно, перезагрузка нужна? – Kaponir

+1

Следует отметить, что здесь нет родительских/дочерних отношений. Если _any_ process устанавливает значение «Machine», то любой другой процесс может его поднять. Создание имен переменных среды, основанных на идентификаторах процесса, несколько помогло бы, в результате чего получилось бы восхитительное распространение в реестре. – HABO

+0

@Mohit Shrivastava Спасибо, я использовал ваш подход (я также видел его в MSDN, он имеет некоторые недостатки - другие процессы могут вмешиваться, поэтому я искал что-то еще). И я получаю следующее решение, которое ** напрямую ** решает мой вопрос, но он многословен, а используемые в нем функции Win API не поддерживаются в Windows 10: https://blog.gapotchenko.com/eazfuscator.net/reading-environment-variables – Kaponir

Смежные вопросы