. NET Приложение Core 3.1 не находит переменную среды - PullRequest
1 голос
/ 11 апреля 2020

Я не могу заставить мое консольное приложение. 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}");
    }

Это вывод:

console output

и системные переменные ясно показывают, что переменная установлена:

system variable screenshot

Аналогично, когда я выполняю эхо-запрос из командной строки для переменной TestKey, он правильно возвращает соответствующее значение.

command prompt output

Это Windows 10 Pro компьютер и он не является частью домена. Такое поведение действительно озадачивает. Я перезагрузил компьютер, и системная переменная сохраняется, но все равно не появится в приложении.

1 Ответ

2 голосов
/ 11 апреля 2020

Здесь есть два основных момента. Во-первых, согласно Конфигурация в ASP. NET Ядро , переменные среды извлекаются только для текущего процесса

Устанавливаются только в процессах, запущенных из командного окна, в котором они находились. установить в

Таким образом, вы должны установить их в том же командном окне перед запуском приложения или добавить в launchsettings.json файл

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

и перезапустить Visual Studio для этого. Или просто измените его в свойствах Debug вашего проекта

enter image description here

Во-вторых, чтобы можно было получить системную переменную среды в GetEnvironmentVariable метод, вы должны указать EnvironmentVariableTarget.Machine параметр

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

По умолчанию

Метод GetEnvironmentVariable(String) извлекает переменную среды из среды только блок текущего процесса

Или, если вы добавите переменную к launchsettings.json в предыдущей точке, установка цели не требуется.

Однако, если вы запустит ваш проект в командной строке через dotnet run, вы также сможете получить доступ к системной переменной среды, поскольку

В Windows системах блок среды текущего процесса включает в себя:

  • Все переменные среды, предоставленные ему родительским процессом, который его создал. Например, приложение. NET, запускаемое из окна консоли, наследует все переменные среды окна консоли.

  • Если нет родительского процесса, среды для компьютера и пользователя переменные используются вместо. Например, в новом окне консоли все переменные среды для компьютера и для пользователя определены во время его запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...