Я пишу приложение, составленное из нескольких модулей, написанных на разных языках (например, Java, C #, C ++). Я испытываю странное поведение, когда переменные среды, которые я устанавливаю в одном модуле (например, C #), не распространяются на другие модули. Насколько я понимаю, проблема связана с тем, что переменные среды в Windows доступны через структуру _environ в библиотеке времени выполнения, а не через дескриптор процесса, следовательно, библиотеки, использующие разные среды выполнения, имеют разные переменные среды.
В частности, для C # эта проблема возникает, только если я компилирую и запускаю код в Release, тогда как компиляция кода в Debug работает просто отлично.
Приведенный ниже код воспроизводит проблему с двумя очень простыми модулями. написано на C # и C ++. Я скомпилировал код с VS2015 Professional. Код C # был скомпилирован с помощью среды выполнения v4.0 и .NET Framework v4.5.2
C # исполняемый файл
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
[DllImport("cpp_lib.dll", CharSet = CharSet.Unicode)]
public static extern void print_path();
static void Main(string[] args)
{
var path = Environment.GetEnvironmentVariable("PATH");
path += ";D:\\Temp";
Environment.SetEnvironmentVariable("PATH", path);
// Print the path from C#
Console.WriteLine("Path from C#: " + Environment.GetEnvironmentVariable("PATH"));
// Print the path from c++
print_path();
}
}
}
Библиотека C ++
#include <iostream>
#include <Windows.h>
extern "C" {
__declspec(dllexport) void print_path() {
std::cout << "PATH seen in C++: " << getenv("PATH") << std::endl;
}
}
Как уже было сказано, при запускекод в Debug по тому же пути печатается из C # и C ++, но выполнение кода в Release приводит к тому, что в PATH, напечатанном из c ++, отсутствует папка D: \ Temp