C#/.NET应用程序无法识别环境变化(PATH)

Ran*_*age 5 c# variables environment path

在我的C#app中,我以编程方式安装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);
Run Code Online (Sandbox Code Playgroud)

我被告知如果你停止并重新启动有问题的过程,它应该采取这些类型的更改,但重新启动我的应用程序不会这样做.我想这可能是一个Oracle问题,关于Oracle的一些事情需要登录来识别这个变化,我不确定.提前致谢.

nic*_*ick 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
Run Code Online (Sandbox Code Playgroud)

我不知道这是否适用于其他正在运行的进程,但它应该适用于您的应用程序进行获取/设置