我有一个为Linux编译的C#控制台应用程序。该应用程序需要访问环境变量。我尝试使用EXPORT var1=value1
或通过在/etc/environment
中设置它。我看到环境变量在我执行printenv
时设置正确,但当我的应用程序运行时,它无法访问该变量。
有人能建议如何让我的应用程序访问环境变量吗?我在RHEL 8上运行它,在我的应用程序中,我使用Environment.GetEnvironmentVariable
访问环境变量
下面是一个代码来演示它:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var env = Environment.GetEnvironmentVariable("HOMEBREW_PREFIX");
Console.WriteLine($"In worker process: {env}");
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
字符串
下面是printenv
的部分输出,它显示了名为HOMEBREW_PREFIX
的环境变量已正确设置。
HOMEBREW_PREFIX=/opt/homebrew
HOMEBREW_CELLAR=/opt/homebrew/Cellar
型
以下是断点处的屏幕截图和我的监 windows 口:
的数据
这在我的mac和我的RHEL盒子上都发生了。Environment.GetEnvironmentVariable()
返回null
,无法访问环境变量。
还有another question that seems to be doing similar things,但是我正在尝试访问一个已经存在的环境变量,而另一个正在尝试设置它。
我该如何解决此问题?
3条答案
按热度按时间gajydyqb1#
在浏览Environment.GetEnvironmentVariable的在线文档时,我注意到在备注标题下有以下内容:
GetEnvironmentVariable(String)方法仅从当前进程的环境块中检索环境变量。它等效于调用目标值为EnvironmentVariableTarget.Process的GetEnvironmentVariable(String,EnvironmentVariableTarget)方法。
要检索所有环境变量沿着其值,请调用GetEnvironmentVariables方法。
尝试切换到该方法,看看是否可以解决您的问题。
kkih6yb82#
通常情况下,它值得阅读the docs for the method。当我们这样做时,我们看到下面的摘录:
在非Windows系统上,GetEnvironmentVariables方法检索所有环境变量的名称和值,这些环境变量是从启动dotnet进程的父进程继承的,或者是在dotnet进程本身的范围内定义的。一旦dotnet进程结束,这些环境变量就不再存在。
在基于Unix的系统上运行的.NET不支持每台机器或每用户环境变量。
gzjq41n43#
尝试使用此方法的版本,它支持target作为第二个参数。可能是,这些环境变量对进程目标不可见。