【发布时间】:2012-12-24 14:09:00
【问题描述】:
当我启动 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) 获得的环境变量与我的应用程序启动时的变量相同。但这不是更新变量。
有没有办法直接从系统中获取这些变量。
【问题讨论】:
-
另外我想提一下:如果我尝试使用 RegistryKey regEnvir = Registry.CurrentUser.OpenSubKey("Environment"); 从注册表中获取环境变量从我启动应用程序开始,我也得到了旧的变量集。
-
密钥错误,系统环境存放在
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment。如果你没有看到它改变,那么这个程序只会修改它自己的环境。并可能将其传递给它启动的进程。
标签: c# .net environment-variables