启动后在C#中重新加载环境变量

我们收到了一个新的代码库,它使用了整个地方的环境变量。 他们指向项目根,资产,不同工具等等。不是最理想的情况,但它的工作原理。 然而,当到了尝试运行我们的自动构建时,它就变成了巨大的痛苦。

Windows似乎在创建进程时实例化环境变量,并且不会再次刷新这些值。 我们希望能够让我们的自动构建系统运行一个项目列表并按顺序构建每个项目。 这需要调用更改这些值的项目切换器。 完成此操作后,更改不会反映在当前正在运行的构建过程中。

有没有人知道任何C#命令/函数/等可用于在调用项目切换器后强制环境变量重新加载?

System.Environment.GetEnvironmentVariable和System.Environment.GetEnvironmentVariable有重载检索:

…来自当前进程或当前用户或本地计算机的Windows操作系统注册表项的环境变量的值。

如果您的更改影响了指定区域中的注册表,则这可能对您有用。

根据MSDN :

“在创建进程期间更改子进程的环境变量是一个进程可以直接更改另一个进程的环境变量的唯一方法。进程永远不能直接更改另一个进程的环境变量,而该进程不是该进程的子进程。”

如果项目切换器不是太复杂,您可以简单地在当前进程中设置环境变量(例如,使用Environment.SetEnvironmentVariable或ProcessStartInfo.EnvironmentVariables)。

如果要打开命令提示符(cmd.exe)然后更改环境变量,则cmd.exe的该实例将不会看到这些更改。 如果要打开cmd.exe的新实例,则会看到新的更改。 (如果您更改了用户环境变量而不是系统变量)。

我不知道如何在.NET中模仿这个。 您可以尝试创建一个新的AppDomain,看看它是否有效。

如果没有,您可以尝试看看如果通过启动新进程创建程序集的新实例会发生什么。 在您的情况下,这可能意味着您必须更改自动构建系统以将新项目的构建作为新进程触发。

我知道这些不是直接的答案,但也许它们会让你知道如何继续。

这不是刷新环境变量的问题。 每个进程都有自己的环境,在进程创建时,环境是其父环境的副本。

更改正在运行的进程环境的唯一方法是让进程本身更改它。 必须在两个正在运行的进程之间传递的任何信息都必须通过某种forms的IPC来完成。

例如,从文件或数据库而不是从环境中读取相关变量可能更好。 数据库当然更容易,因为它使事务和同步更容易。