【发布时间】:2020-02-26 17:14:01
【问题描述】:
我正在编写一个由使用不同语言(即 Java、C#、C++)编写的多个模块组成的应用程序。 我遇到了一种奇怪的行为,我在一个模块(例如 C#)中设置的环境变量没有传播到其他模块。 据我了解,问题是由于 Windows 中的环境变量是通过运行时库中的 _environ 结构访问的,而不是通过进程描述符,因此使用不同运行时的库具有不同的环境变量。
特别是对于 C#,这个问题似乎只有在我在 Release 中编译和运行代码时才会出现,而在 Debug 中编译代码就可以了。
下面的代码使用 C# 和 C++ 编写的两个非常简单的模块重现了该问题。我用 VS2015 Professional 编译了代码。 C# 代码使用 runtime 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 中运行代码会导致从 c++ 打印的 PATH 缺少 D:\Temp 文件夹
【问题讨论】:
标签: c# c++ windows environment-variables