当我启动 C# 进程时,系统环境变量被其他一些进程更改。所以我想将环境重新加载到我的进程中,因为这个应用程序也启动了需要更新环境的子进程。这是我尝试获取和设置环境变量的方式:
Dictionary<String,String> uservars= new Dictionary<String,String>();
Dictionary<String, String> sysvars = new Dictionary<String, String>();
foreach (System.Collections.DictionaryEntry de in System.Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine))
sysvars.Add(de.Key.ToString().ToUpper(),de.Value.ToString());
foreach (System.Collections.DictionaryEntry de in System.Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User))
{
uservars.Add(de.Key.ToString().ToUpper(), de.Value.ToString());
}
Dictionary<string, string> newdict = new Dictionary<string, string>();
foreach (KeyValuePair<String, String> kvp in uservars)
{
if (sysvars.ContainsKey(kvp.Key))
{
newdict.Add(kvp.Key, kvp.Value + ";" + sysvars[kvp.Key]);
sysvars.Remove(kvp.Key);
}
else
newdict.Add(kvp.Key, kvp.Value);
}
foreach (KeyValuePair<string, string> kvp in sysvars)
newdict.Add(kvp.Key, kvp.Value);
foreach (KeyValuePair<string, string> kvp in newdict)
{
System.Environment.SetEnvironmentVariable(kvp.Key, kvp.Value);
}
问题是,我通过 System.Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User)
获得的环境变量与我的应用程序启动时的变量相同。但这不是更新变量。
有没有办法直接从系统中获取这些变量。
最佳答案
环境变量有3组——来自机器的全局变量、用户保存的变量和当前进程的变量
Environment.SetEnvironmentVariable(key, value)
设置当前进程的变量,不会改变全局或用户的变量,读取当前进程变量需要使用Environment .GetEnvironmentVariables(EnvironmentVariableTarget.Process)
当您运行子进程时,您的进程环境变量将被复制到子进程环境变量中。
更新(并回答评论):
我认为你误解了环境变量的工作原理,它们只能用于在进程创建期间将数据从父进程传递到子进程,它们不能用于进程之间传递数据。
环境变量是这样工作的:
每个进程都有自己的环境变量私有(private)副本,每个进程都可以随时更改该私有(private)副本,它是一个对系统其余部分没有任何影响的私有(private)副本。
当一个进程启动另一个进程时,父进程的私有(private)环境变量被复制到新的子进程,在该操作之后,新的子进程拥有一个不再连接到父进程的环境变量的私有(private)副本。
注册表中存储了机器和用户环境变量,这些是在启动时第一个进程传递的值(并且,为了避免重新启动,如果您发送正确的通知,Windows 资源管理器将在启动新进程时加载它们) 更改进程的环境变量不会更改用户/机器设置,更改用户/机器设置不会影响任何正在运行的进程。
例如,运行两个命令 (cmd.exe) 窗口,使用 SET 命令更改其中一个的环境,然后在另一个窗口中运行 SET 命令,可以看到没有任何变化。
所以,不存在“系统的当前环境”这样的东西,如果一个进程改变了它的环境,另一个进程就没有办法发现和读取这个变化(除了使用让调试器读取其他进程内存的 API,但你真的不想去那里)。
关于C# 重新加载系统环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14022411/