【问题标题】:Reload Environment Variables in C# after launch启动后在 C# 中重新加载环境变量
【发布时间】:2010-11-24 17:15:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net build-automation environment-variables


    【解决方案1】:

    System.Environment.GetEnvironmentVariableSystem.Environment.GetEnvironmentVariable 的重载可以检索:

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

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

    【讨论】:

    • 这为我解决了一个问题。我更改了环境变量,但即使在重新启动应用程序后,旧值也被返回。我使用了EnvironmentVariableTarget.Machine,它解决了这个问题。显然EnvironmentVariableTarget.Process 是默认值。
    • EnvironmentVariableTarget.Machine 对我不起作用,但 EnvironmentVariableTarget.User 对我有用。我认为这取决于变量的保存位置。我假设你的是“系统变量”
    【解决方案2】:

    根据MSDN

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

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

    【讨论】:

      【解决方案3】:

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

      我不知道如何在 .NET 中模拟这一点。您可以尝试创建一个新的 AppDomain 并查看是否可行。

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

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

      【讨论】:

      • 您能否解释得更清楚些。我正在运行 wpf 应用程序并通过将 cmd.exe 作为进程执行来运行 choco list -l cmd。我的应用程序在安装巧克力软件之前启动,并且每次作为新进程每 5 秒执行一次 thz 命令,直到它以代码 0 退出这意味着安装了巧克力。在实践中它没有按预期工作
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-03
        • 1970-01-01
        • 1970-01-01
        • 2021-11-29
        • 2015-05-25
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多