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

启动后在C#中重新加载环境变量,c#,.net,build-automation,environment-variables,C#,.net,Build Automation,Environment Variables,我们收到了一个新的代码库,它在各地使用环境变量。它们指向项目根、资产、不同的工具等。虽然不是最理想的情况,但它是有效的。然而,到了尝试运行我们的自动化构建的时候,它就变成了一个巨大的痛苦 Windows似乎在创建进程时引用环境变量,并且不再刷新这些值。我们希望能够让我们的自动构建系统在项目列表中运行,并按顺序构建每个项目。这需要调用项目切换器来更改这些值。但是,完成此操作后,更改不会反映在当前运行的构建过程中 是否有人知道在调用project switcher后,可以使用任何C#命令/函数等强制

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

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


是否有人知道在调用project switcher后,可以使用任何C#命令/函数等强制重新加载环境变量

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

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

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

我知道这些都不是直截了当的答案,但也许它们能给你一个如何继续的想法。

有太多的和检索:

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

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

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

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

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

根据:

“在流程创建过程中更改子流程的环境变量是一个流程可以直接更改另一个流程的环境变量的唯一方法。一个流程永远不能直接更改不是该流程子流程的另一个流程的环境变量。”


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

这为我解决了一个问题。我更改了环境变量,但即使在重新启动应用程序后,也返回了旧值。我使用了
EnvironmentVariableTarget.Machine
,它解决了这个问题。显然
EnvironmentVariableTarget.Process
是默认值。
EnvironmentVariableTarget.Machine
对我不起作用,但
EnvironmentVariableTarget.User
起作用。我认为这取决于变量保存的位置。我想你的是“系统变量”,请你解释清楚。我正在运行一个wpf应用程序,并通过将cmd.exe作为一个进程执行来运行choco list-l cmd。我的应用程序在安装Chocolate软件之前启动,并作为一个新进程每5秒执行一次thz命令,直到它以代码0退出,这意味着安装了Chocolate。实际上,它并没有像预期的那样工作