在我的C#应用程序中,我以编程方式安装Oracle客户端(如果不存在),这需要在PATH系统环境变量中添加dir。这一切都可以正常工作,但只有在用户注销到窗口或重新启动后才会生效。如何在没有此步骤的情况下让我的应用识别并使用新的PATH var?即使重新启动我的应用程序也会比要求用户注销/更好。
据说,将此更改广播到其他进程应该有效。这是我尝试过的,没有成功:
using System.Runtime.InteropServices;
private const int HWND_BROADCAST = 0xffff;
private const int WM_WININICHANGE = 0x001a, WM_SETTINGCHANGE = WM_WININICHANGE, INI_INTL = 1;
[DllImport("user32.dll")]
private static extern int SendMessageTimeoutA(int hWnd, uint wMsg, uint wParam, string lParam, int fuFlags, int uTimeout, int lpdwResult);
int rtnVal = 0;
SendMessageTimeoutA(HWND_BROADCAST, WM_SETTINGCHANGE, 0, "Environment", 2, 5000, rtnVal);
我被告知如果您停止并重新启动有问题的流程,它应该采取这些类型的更改,但重新启动我的应用程序不会这样做。我想这可能是一个Oracle问题,关于Oracle的一些事情需要登录来识别变化,我不确定。提前谢谢。
答案 0 :(得分:1)
Environment.GetEnvironmentVariable("MYVAR", EnvironmentVariableTarget.Machine)不起作用吗?
如果我的应用程序正在运行,那么我可以
Environment.SetEnvironmentVariable("MYVAR", "cool", EnvironmentVariableTarget.Machine);
//do some other stuff...
Console.WriteLine(Environment.GetEnvironmentVariable("MYVAR", EnvironmentVariableTarget.Machine));
C:\TestApp>>TestApp.exe
cool
我不知道这是否适用于其他正在运行的进程,但它应该为您的应用程序执行获取/设置
答案 1 :(得分:1)
您的问题只是某些应用会侦听该消息(例如资源管理器),因此您的应用程序根本不会使用它。由于环境通常是继承的,因此从内部重新启动应用程序无济于事,因为它将获得您当前的环境阻止。如果用户从开始菜单重新启动它将起作用(假设已广播WM_SETTINGCHANGE)。
最好使用Environment.GetEnvironmentVariable从注册表中读出当前值并将其合并回当前环境。基本上做
Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.Machine) + ";" + (Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.User)));
答案 2 :(得分:0)
在我们的项目中,我们使用Instant Client存档中的“install.bat”设置Oracle Instant Client。例如:
install.bat odp.net1x%1名称