Перезапуск переменных среды в C # после запуска - PullRequest
3 голосов
/ 01 сентября 2009

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

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

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

Ответы [ 4 ]

7 голосов
/ 01 сентября 2009

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

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

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

4 голосов
/ 01 сентября 2009

Согласно MSDN :

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

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

2 голосов
/ 01 сентября 2009

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

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

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

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

1 голос
/ 01 сентября 2009

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

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

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

...