【问题标题】:How to set a global environment variable in .NET Core (user-wide or system-wide)如何在 .NET Core(用户范围或系统范围)中设置全局环境变量
【发布时间】:2021-09-26 17:06:32
【问题描述】:

在完整的 .NET 中,我们可以将 EnvironmentVariableTarget 枚举传递给 Environment.SetEnvironmentVariable 调用:

public enum EnvironmentVariableTarget
{
    Process,
    User,
    Machine
}

使用UserMachine 选项,我们可以设置用户范围或系统范围的变量,该变量在应用程序结束后仍然有效:

Environment.SetEnvironmentVariable("foo", "bar", EnvironmentVariableTarget.User);

...

> echo %foo%
bar

但是,Environment.SetEnvironmentVariable 不接受 .NET Core 中的变量目标。甚至这种方法的 XML 注释都说:

创建、修改或删除存储在当前进程中的环境变量。

如何在面向 .NET Core 的应用程序中设置用户范围或机器范围的环境变量?只有跨平台解决方案才有意义(至少是 Windows 和 Linux)。

【问题讨论】:

  • 大多数 linux 发行版都有不同的环境变量设置机制。 mac 也有它自己的(虽然类似于许多 linux 风格)。你需要看看你的目标系统需要什么,这里没有真正的跨平台解决方案——我想只有 Windows 才是真正的痛点(在 linux 上,它主要是在已知位置添加一个文件)。跨度>

标签: c# environment-variables cross-platform .net-core


【解决方案1】:

对于 .NET Core 1.x,它只允许在用户上下文中设置环境变量。通过新的 .NET Core 2.0 预览版,它允许使用 EnvironmentVariableTarget。但是,根据this GitHub 问题设置用户或机器环境变量在非 Windows 平台上不起作用。

在非 Windows 平台上使用其他范围(例如用户、机器))未映射到实现中。

GitHub issue 中还描述了使用变通方法检查是否是非windows平台来设置环境变量。例如:

// 省略检查 bash 二进制文件的存在 if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) System.Diagnostics.Process.Start("/bin/bash", "-c export" + 变量 + "=" + value);

【讨论】:

  • 最近我再次检查了 GitHub 问题...您引用的解决方法不起作用。甚至在下面的 cmets 中也提到过。
猜你喜欢
  • 2019-12-15
  • 1970-01-01
  • 2023-03-24
  • 2021-05-16
  • 2014-01-07
  • 2015-03-22
  • 2016-01-27
  • 2017-12-06
相关资源
最近更新 更多