2009-09-01 2 views
3

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

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

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

ответ

1

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

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

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

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

7

Есть перегруженные System.Environment.GetEnvironmentVariable и System.Environment.GetEnvironmentVariable, извлекающие:

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

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

+0

Это решило проблему для меня. Я изменил переменную окружения но даже после перезапуска приложения было возвращено старое значение. Я использовал «EnvironmentVariableTarget.Machine» и решил проблему. По-видимому, значение «EnvironmentVariableTarget.Process» является значением по умолчанию. – zmechanic

1

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

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

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

4

По MSDN:

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

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

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