C# 通过SetEnvironmentVariable进行的更改不会在使用getenv的库中生效

C# 通过SetEnvironmentVariable进行的更改不会在使用getenv的库中生效,c#,environment-variables,pinvoke,C#,Environment Variables,Pinvoke,我有一个简单的c#应用程序,它通过mingnu编译器工具集绑定到库编译。我可以轻松地调用库中的函数而不会出现问题 但是,库调用getenv来设置自身。需要设置此环境变量,库才能正常工作,因此我使用的是environment.SetEnvironmentVariable,但是库无法检索我设置的值。getenv在启动时复制进程的环境变量块。通过SetEnvironmentVariable进行的任何后续更改都不会反映在getenv使用的变量块中。您将需要pinvoke setenv函数,以便在随后的g

我有一个简单的c#应用程序,它通过mingnu编译器工具集绑定到库编译。我可以轻松地调用库中的函数而不会出现问题


但是,库调用
getenv
来设置自身。需要设置此环境变量,库才能正常工作,因此我使用的是
environment.SetEnvironmentVariable
,但是库无法检索我设置的值。

getenv在启动时复制进程的环境变量块。通过SetEnvironmentVariable进行的任何后续更改都不会反映在getenv使用的变量块中。您将需要pinvoke setenv函数,以便在随后的getenv调用中调整值

见:


“getenv和_putenv使用全局变量_environ指向的环境副本来访问环境。getenv仅在运行时库可访问的数据结构上运行,而不在环境上运行”段“由操作系统为进程创建。因此,使用Envp参数到主或WMeN的程序可能会检索无效信息。“

< P>”可以将“PuthEnvIs函数”导入到C++类中,以便以对本机C++代码可见的方式设置环境变量。 这将使用
互操作服务

using System.Runtime.InteropServices;

public class TestEnv
{
    [DllImport( "msvcrt.dll" )]
    public static extern int _putenv_s( string e, string v );

    public TestEnv()
    {
        _putenv_s( "ENV_VAR", "VALUE" );
    }
}

有一个教程可能有用。

你在创建一个本地C++对象后只需设置环境变量,那么C++可以使用GEnEV函数或ACEOSOS::GETEN()获取环境变量的值。.

确保设置了正确的EnvironmentVariableTarget。我打赌,如果将其设置为机器级别,它应该可以正常工作。这可能与Unicode有关。典型CRT中保持getenv()的仿真代码与本机utf-16环境兼容可能会非常复杂。例如,MSVC one会生成一个惰性副本。这是一个棘手的问题。如果本机代码是使用Visual Studio 2015编译的,那么您可能必须这样做:[DllImport(“UCRTBASE.DLL”,EntryPoint=“\u putenv\u s”)]public static extern int\u putenv\u 14(字符串e,字符串v)5944;