Перезагрузить переменные среды в C# после запуска

Мы получили новую кодовую базу, которая повсеместно использует переменные окружения. Они указывают на такие вещи, как корень проекта, активы, различные инструменты и т. д. Не самая идеальная ситуация, но она работает. Однако, когда приходит время попробовать запустить нашу автоматизированную сборку, это становится огромной проблемой.

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

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


person Motie Mediator    schedule 01.09.2009    source источник


Ответы (4)


Существуют перегрузки System.Environment.GetEnvironmentVariable и System.Environment.GetEnvironmentVariable, которые извлекают:

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

Если ваши изменения влияют на реестр в указанных областях, это может сработать для вас.

person JeffH    schedule 01.09.2009
comment
Это решило проблему для меня. Я изменил переменную среды, но даже после перезапуска приложения вернулось старое значение. Я использовал EnvironmentVariableTarget.Machine, и это решило проблему. По-видимому, EnvironmentVariableTarget.Process является значением по умолчанию. - person zmechanic; 19.08.2016
comment
EnvironmentVariableTarget.Machine мне не помогло, а EnvironmentVariableTarget.User помогло. Я думаю, это зависит от того, где сохраняются переменные. Я предполагаю, что у вас были системные переменные - person Stephen; 15.06.2018

Согласно MSDN:

«Изменение переменных среды дочернего процесса во время создания процесса — это единственный способ, которым один процесс может напрямую изменить переменные среды другого процесса. Процесс никогда не может напрямую изменять переменные среды другого процесса, который не является дочерним по отношению к этому процессу».

Если переключатель проекта не слишком сложен, вы можете просто установить переменные среды в текущем процессе (например, используя Environment.SetEnvironmentVariable или ProcessStartInfo.EnvironmentVariables).

person Special Touch    schedule 01.09.2009

Если вы откроете командную строку (cmd.exe), а затем измените переменные среды, этот экземпляр cmd.exe не увидит этих изменений. Если вы откроете новый экземпляр cmd.exe, он увидит новые изменения. (При условии, что вы изменили переменные среды пользователей, а не системные).

Я не знаю, как имитировать это в .NET. Что вы можете попробовать, так это создать новый AppDomain и посмотреть, работает ли он.

Если это не так, вы можете попробовать и посмотреть, что произойдет, если вы создадите новый экземпляр своей сборки, запустив новый процесс. В вашем случае это может означать, что вам нужно изменить автоматизированную систему сборки, чтобы запускать сборки нового проекта в качестве нового процесса.

Я знаю, что это не прямые ответы, но, возможно, они дадут вам представление о том, как действовать дальше.

person Guillaume Hanique    schedule 01.09.2009
comment
Не могли бы вы объяснить это более ясно. Я запускаю приложение wpf и запускаю choco list -l cmd, выполняя cmd.exe как процесс. Мое приложение запускается перед установкой шоколадного программного обеспечения и выполняет команду thz каждые 5 секунд каждый раз как новый процесс, пока он не завершится с кодом 0 что означает, что шоколад установлен. На практике это не работает, как ожидалось - person djkpA; 05.10.2018

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

Единственный способ изменить среду запущенного процесса — изменить ее самому процессу. Любая информация, которая должна передаваться между двумя запущенными процессами, должна передаваться через некоторую форму IPC. .

Например, может быть лучше читать соответствующие переменные из файла или базы данных, а не из среды. База данных, безусловно, проще, поскольку упрощает транзакции и синхронизацию.

person P Daddy    schedule 01.09.2009