我有一个c#应用程序,它会生成一个新的Process,其中设置了一个环境变量。在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();
此示例以某种方式简化,因为在我的实际应用程序中,我执行一个动态设置特定环境的命令脚本,但此代码段将其降至最低。
关键是我需要访问在生成的进程中定义的环境变量,我需要从c#应用程序访问它。
但是,我从ProcessStartInfo对象获取的环境变量列表似乎没有反映新创建的环境变量“mySpecialEnv”。
我的第一个疑问是,ProcessStartInfo可能并不真正访问进程的环境代码块,而只是从注册表中获取信息。有人能证实吗?我用Google搜索了很长时间,但未找到确认信息......
我的第二个疑问是我遇到了竞争条件(例如我试图过早地访问环境变量),但即使使用实施的轮询机制,我也没有得到更好的结果。
用纯粹的.net可以实现这种方式吗? 1)Spawn过程,它创建一个新的环境变量 2)从c#应用程序
访问/读取此环境变量非常感谢你!
答案 0 :(得分:0)
在p.start()之后,你需要等到它完成整个过程
然后你需要启动另一个进程来检查你的环境变量。
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();
p.WaitForExit();
ICollection envVarsSpawnedProcess = p.StartInfo.EnvironmentVariables.Keys;
if (envVarsSpawnedProcess.Cast<string>().Contains("MYSPECIALENV"))
{
Console.WriteLine("Found! :)");
}
else
{
Console.WriteLine("Not found :(");
}