2013-05-08 88 views
0

我正在使用一个C#dll,我使用Installshield将Oracle路径添加到Path环境系统变量中以便能够由于即时客户端连接到Oracle数据库。我想修改路径环境系统变量,而无需重新启动或重新启动cmd,因为c#

Whan我第一次运行安装程序它不成功,但更改为路径变量。它在第二次尝试中成功,因为路径已经从第一次运行中更改。 因此得出的结论是Oracle数据库提供者在用代码修改后不直接查看更改。

我想要一种方法来检测路径变量的变化,而不需要第二次尝试安装。

var ancientPath = Environment.GetEnvironmentVariable("path", EnvironmentVariableTarget.Machine); 

Environment.SetEnvironmentVariable("path", ancientPath + ";" + tmp, EnvironmentVariableTarget.Machine); 
+0

var ancientPath = Environment.GetEnvironmentVariable(“path”,EnvironmentVariableTarget.Machine); Environment.SetEnvironmentVariable(“path”,ancientPath +“;”+ tmp,EnvironmentVariableTarget.Machine); – 2013-05-08 14:08:56

回答

0

你想要做的是明确不可行。一个进程可以修改它自己的环境,它可以产生具有不同环境的进程,但没有进程可以改变另一个进程的环境。在首次安装后启动新进程时,应该会看到更新的路径。

如果您希望现有进程使用新的环境变量,则必须重新启动它。如果您的安装程序由于缺少路径信息而失败,那么您将不得不解决该问题。

+0

我试图在修改相同方法中的路径变量之后创建一个OracleConnection,我想这意味着它在同一个进程中,不是吗?当我记录新的路径值时,我发现它发生了变化,但不幸的是,OracleConnection的新实例失败,但是当我重新启动整个设置而不仅仅是方法调用时它会通过。 – 2013-05-08 15:04:37

+0

有没有办法将这种改变传播给父进程? – 2013-05-08 15:12:17

+0

“失败”究竟意味着什么? – 2013-05-08 15:18:11

0

尝试发送WM_SETTINGCHANGE消息到所有窗口,如following MSDN article中所述。

SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0, (LPARAM) “环境”,SMTO_ABORTIFHUNG, 5000,& dwReturnValue);