Изменения через SetEnvironmentVariable не вступают в силу в библиотеке, которая использует getenv - PullRequest
4 голосов
/ 25 января 2011

У меня есть простое приложение на c #, которое привязывается к компиляции библиотеки с помощью набора инструментов компилятора mingnu.Я могу легко вызывать функции в библиотеке без проблем.

Однако библиотека вызывает getenv, чтобы настроить эту переменную окружения, чтобы библиотека работала правильно, поэтому я использую Environment.SetEnvironmentVariableбиблиотека не может получить значение, которое я установил.

Ответы [ 3 ]

5 голосов
/ 18 февраля 2011

getenv при запуске копирует блок переменной среды процесса. Любые последующие изменения через SetEnvironmentVariable не будут отражены в блоке переменных, используемых getenv. Вам нужно будет вызвать функцию setenv, чтобы скорректированное значение отразилось в последующих вызовах getenv.

См .: http://msdn.microsoft.com/en-us/library/tehxacec(VS.71).aspx

"getenv и _putenv используют копию среды, на которую указывает глобальная переменная _environ, для доступа к среде. Getenv работает только со структурами данных, доступными для библиотеки времени выполнения, а не с сегментом среды, созданным для процесс операционной системой. Поэтому программы, которые используют аргумент envp для main или wmain, могут получить неверную информацию. "

3 голосов
/ 31 июля 2013

Вы можете импортировать функцию _putenv_s в ваш класс C #, чтобы установить переменную среды так, чтобы она была видна нативному коду C ++.

Используется InteropServices:

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" );
    }
}

Здесь есть учебник , который может быть полезен.

0 голосов
/ 30 мая 2019

Вы просто устанавливаете переменную среды после создания собственного объекта C ++, тогда C ++ может получить значение переменной среды, используя функцию getenv или ACE_OS :: getenv ().

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