【发布时间】:2015-12-15 11:42:09
【问题描述】:
我有一个 c# 应用程序,它生成一个新进程,其中设置了环境变量。在 c# 应用程序中,在进程运行期间,我想访问该变量。
源代码如下:
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/c " + "\"" + "set MYSPECIALENV=someContent & set & pause" + "\"";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = true;
Console.WriteLine("Starting process");
p.Start();
ICollection envVarsSpawnedProcess = p.StartInfo.EnvironmentVariables.Keys;
if (envVarsSpawnedProcess.Cast<string>().Contains("MYSPECIALENV"))
{
Console.WriteLine("Found! :)");
}
else
{
Console.WriteLine("Not found :(");
}
p.WaitForExit();
这个例子在某种程度上被简化了,因为在我的实际应用程序中,我执行了一个动态设置特定环境的命令脚本,但是这段代码 sn-p 将它降至最低。
关键是我需要访问在衍生进程中定义的环境变量,我需要从c#应用程序中访问它。
但是,我从 ProcessStartInfo 对象获得的环境变量列表似乎没有反映新创建的环境变量“mySpecialEnv”。
我的第一个疑问是 ProcessStartInfo 可能并没有真正访问进程的环境代码块,而只是从注册表中获取信息。有人可以证实这一点吗?我用谷歌搜索了很长时间,但没有找到确认...
我的第二个疑问是我遇到了竞争条件(例如,我尝试过早访问环境变量),但即使实施了轮询机制,我也没有得到更好的结果。
这是否有可能通过纯 .net 实现? 1) Spawn 进程创建一个新的环境变量 2) 从 c# 应用程序访问/读取此环境变量
非常感谢您!
【问题讨论】:
标签: c# .net process environment-variables