.NET Core 3.1 应用程序找不到环境变量

cyg*_*nim 5 c# .net-core asp.net-core

我无法让我的 .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}");
    }
Run Code Online (Sandbox Code Playgroud)

这是输出:

控制台输出

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

系统变量截图

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

命令提示符输出

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

Pav*_*ski 11

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

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

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

"environmentVariables": {
  "Test": "Test",
  "ASPNETCORE_ENVIRONMENT": "Development"
}
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

其次,为了能够在GetEnvironmentVariable方法中获取系统环境变量,您应该指定EnvironmentVariableTarget.Machine参数

var envValue = Environment.GetEnvironmentVariable("Test", EnvironmentVariableTarget.Machine);
Run Code Online (Sandbox Code Playgroud)

默认情况下

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

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

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

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

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

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