【问题标题】:Changes with SetEnvrionmentVariable cant be read with GetEvironmentVaribale until reboot?在重新启动之前,无法使用 GetEnvironmentVariable 读取 SetEnvironmentVariable 的更改?
【发布时间】:2014-03-28 02:23:25
【问题描述】:

环境变量用法的新手。

我正在编写项目设置工具,需要跨会话存储一些用户指定的项目目录路径。 有人建议 Get/SetEvironmentVariable。 所以我设置了一个带有文本框的 Windows 窗体来显示路径。 当我加载它使用 GetEvironmentVariable 的表单时,文本框会按预期填充。 但是当我尝试使用 SetEvironmentVariable 更新值时, 文本框是空的,在重新启动之前不显示更新的变量。

    private void button1_Click(object sender, EventArgs e)
    {
        Environment.SetEnvironmentVariable("my_project_dir", "C:\path\to\my\project" , EnvironmentVariableTarget.Machine );
        textBox1.Text = Environment.GetEnvironmentVariable("my_project_dir", EnvironmentVariableTarget.Machine);
    }

【问题讨论】:

标签: c# environment-variables


【解决方案1】:

这是因为您将环境变量设置为机器范围的变量。详情请见msdn

环境变量从 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Windows 操作系统注册表中的 Manager\Environment 键。 当用户在 set 操作中创建环境变量时, 操作系统将环境变量存储在系统中 注册表,但不在当前进程中。如果本地有任何用户 机器启动一个新进程,操作系统复制 从注册表到该进程的环境变量。

当进程终止时,操作系统会销毁 该过程中的环境变量。然而,环境 注册表中的变量一直存在,直到用户将其删除 以编程方式或 通过操作系统工具。

重要的是:

当用户在 set 操作中创建环境变量时, 操作系统将环境变量存储在系统中 注册表,但不在当前进程中。

您想要做的是使用EnvironmentVariableTarget.Process(这是默认值,因此您不需要指定任何内容),它将环境变量存储在与当前进程关联的环境块中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2017-06-13
    • 2016-11-26
    • 2016-03-05
    • 2014-03-25
    • 2012-08-02
    • 2014-01-27
    相关资源
    最近更新 更多