2017-01-03 94 views
1

我使用Process.Start()从父进程启动子进程。在子进程中创建新的变量调用如何使用C#中的环境变量将消息从子进程发送到父进程?

Environment.SetEnvironmentVariable("MessageKey", "MessageValue"); 子进程退出后,我想用

var env = childProcess.StartInfo.EnvironmentVariables; 
string MessageValue = env["MessageKey"]; 

变量不存在读取从父进程上述变量。如何使用C#中的环境变量将消息从子进程发送到父进程?

+1

这是行不通的。使用适当的IPC方法来做到这一点。 http://stackoverflow.com/questions/528652/what-is-the-simplest-method-of-inter-process-communication-between-2-c-sharp-pro – OldProgrammer

回答

2

Environment.SetEnvironmentVariable创建,修改或删除存储在当前进程或当前用户或本地计算机预留的Windows操作系统注册表项中的环境变量。 SetEnvironmentVariable(String, String,EnvironmentVariableTarget)方法允许您定义一个环境变量,该环境变量可用于在计算机上运行的所有进程(EnvironmentVariableTarget.Machine值),由用户运行的所有进程(EnvironmentVariableTarget.User值)或当前进程过程值)。将每台机器和每个用户的环境变量复制到当前进程的环境块中。但是,当前进程环境块所特有的环境变量仅在进程结束之前才会保留。

Environment.GetEnvironmentVariable从当前进程或当前用户或本地机器的Windows操作系统注册表项中检索环境变量的值。

EnvironmentVariableTarget指定环境变量在set或get操作中存储或检索的位置。

  1. 机器:环境变量存储或从Windows操作系统注册表中的HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environment键中检索。
  2. 过程:环境变量是从与当前进程关联的环境块中存储或检索的。
  3. 用户:环境变量是从Windows操作系统注册表中的HKEY_CURRENT_USER \ Environment键存储或检索的。

所以,你可以使用

Environment.SetEnvironmentVariable("MessageKey", "MessageValue", EnvironmentVariableTarget.Machine); 

Environment.GetEnvironmentVariable("MessageKey", EnvironmentVariableTarget.Machine); 
+1

无需重新启动父?可能需要重新加载? – Kaponir

+1

应该指出,这里没有父母/子女关系。如果_any_进程设置了一个“机器”值,那么其他任何进程都可以启动它。根据进程ID创建环境变量名称会有所帮助,从而导致令人愉快的注册表运行。 – HABO

+0

@Mohit Shrivastava谢谢你,我用你的方法(我也在MSDN中看到它,它有一些缺点 - 其他进程可能会干扰,所以我正在寻找其他的东西)。我从下面的解决方案**直接**解决了我的问题,但它的详细和Windows API中不支持使用Win API函数:https://blog.gapotchenko.com/eazfuscator.net/reading-environment-variables – Kaponir

相关问题