首页 > 解决方案 > .NET Core 3.1 应用程序找不到环境变量

问题描述

我无法让我的 .NET Core 3.1 控制台应用程序识别我的自定义系统环境变量。我可以提取和打印其他系统变量,例如用户名。但是,如果我在下面的示例中设置了一个像“TestKey”这样的自定义项,它们在应用程序中始终为空。

这是我的代码:

static void Main()
    {
        var config = new ConfigurationBuilder().AddEnvironmentVariables().Build();
        var value = config.GetValue<string>("TestKey");
        var envValue = Environment.GetEnvironmentVariable("TestKey");
        Console.WriteLine($"Config Variable is: {value}");
        Console.WriteLine($"Environment Variable: {envValue}");
    }

这是输出:

控制台输出

和系统变量清楚地显示变量已设置:

系统变量截图

同样,当我从命令提示符对 TestKey 变量执行回显时,它会正确返回关联的值。

命令提示符输出

这是一台 Windows 10 Pro 计算机,它不是域的一部分。这种行为着实令人费解。我已重新启动计算机,系统变量仍然存在,但仍不会出现在应用程序中。

标签: c#asp.net-core.net-core

解决方案


这里有两个要点。首先,根据ASP.NET Core 中的配置,只为当前进程检索环境变量

仅在从设置它们的命令窗口启动的进程中设置

因此,您应该在启动应用程序或添加到launchsettings.json文件之前在同一命令窗口中设置它们

"environmentVariables": {
  "Test": "Test",
  "ASPNETCORE_ENVIRONMENT": "Development"
}

并为此重新启动 Visual Studio。或者只是在项目的调试属性中更改它

在此处输入图像描述

二、要能够在GetEnvironmentVariablemethod中获取系统环境变量,需要指定EnvironmentVariableTarget.Machine参数

var envValue = Environment.GetEnvironmentVariable("Test", EnvironmentVariableTarget.Machine);

默认

GetEnvironmentVariable(String)方法仅从当前进程的环境块中检索环境变量

或者,如果您将变量添加到launchsettings.json上一点,则不需要设置目标。

但是,如果您将在命令行中通过 运行您的项目dotnet run,您应该也可以访问系统环境变量,因为

在 Windows 系统上,当前进程的环境块包括:

  • 创建它的父进程提供给它的所有环境变量。例如,从控制台窗口启动的 .NET 应用程序会继承控制台窗口的所有环境变量。

  • 如果没有父进程,则使用每台机器和每用户的环境变量。例如,一个新的控制台窗口在启动时定义了所有每台机器和每用户的环境变量。


推荐阅读