Linux上的C#控制台应用程序和环境变量

2skhul33  于 12个月前  发布在  Linux
关注(0)|答案(3)|浏览(106)

我有一个为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,但是我正在尝试访问一个已经存在的环境变量,而另一个正在尝试设置它。
我该如何解决此问题?

gajydyqb

gajydyqb1#

在浏览Environment.GetEnvironmentVariable的在线文档时,我注意到在备注标题下有以下内容:
GetEnvironmentVariable(String)方法仅从当前进程的环境块中检索环境变量。它等效于调用目标值为EnvironmentVariableTarget.Process的GetEnvironmentVariable(String,EnvironmentVariableTarget)方法。
要检索所有环境变量沿着其值,请调用GetEnvironmentVariables方法。
尝试切换到该方法,看看是否可以解决您的问题。

kkih6yb8

kkih6yb82#

通常情况下,它值得阅读the docs for the method。当我们这样做时,我们看到下面的摘录:
在非Windows系统上,GetEnvironmentVariables方法检索所有环境变量的名称和值,这些环境变量是从启动dotnet进程的父进程继承的,或者是在dotnet进程本身的范围内定义的。一旦dotnet进程结束,这些环境变量就不再存在。

在基于Unix的系统上运行的.NET不支持每台机器或每用户环境变量。

  • (强调我的)*
gzjq41n4

gzjq41n43#

尝试使用此方法的版本,它支持target作为第二个参数。可能是,这些环境变量对进程目标不可见。

相关问题