.NET安装项目 - 更改注册表设置

问题描述:

我有一个类修改Internet设置的ProxyEnable和ProxyServer注册表项。.NET安装项目 - 更改注册表设置

如果我在控制台应用程序中使用这个类并运行它,值会发生变化,我可以使用regedit查看更改。

现在不工作的部分是我试图在安装程序类中使用此类,以便在安装我的应用程序时更改注册表项。

下面是类代码:

public class ProxySettings { 
    [DllImport("wininet.dll")] 
    public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, 
     IntPtr lpBuffer, int dwBufferLength); 
    public const int INTERNET_OPTION_SETTINGS_CHANGED = 39; 
    public const int INTERNET_OPTION_REFRESH = 37; 
    static bool settingsReturn, refreshReturn; 

    public void EnableProxy(string proxy) { 
     RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); 
     registry.SetValue("ProxyEnable", 1); 
     registry.SetValue("ProxyServer", proxy); 

     settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, 
      IntPtr.Zero, 0); 
     refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); 
    } 

    public void DisableProxy() { 
     RegistryKey registry = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true); 
     registry.SetValue("ProxyEnable", 0); 
     registry.DeleteValue("ProxyServer", false); 

     settingsReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_SETTINGS_CHANGED, 
      IntPtr.Zero, 0); 
     refreshReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_REFRESH, IntPtr.Zero, 0); 
    } 
} 

这里是我Installer类:

[RunInstaller(true)] 
public class WindowsServiceInstaller : Installer { 
    public WindowsServiceInstaller() { 
     ServiceProcessInstaller serviceProcessInstaller = 
          new ServiceProcessInstaller(); 
     ServiceInstaller serviceInstaller = new ServiceInstaller(); 

     //# Service Account Information 
     serviceProcessInstaller.Account = ServiceAccount.LocalSystem; 
     serviceProcessInstaller.Username = null; 
     serviceProcessInstaller.Password = null; 

     //# Service Information 
     serviceInstaller.DisplayName = "Client Service"; 
     serviceInstaller.StartType = ServiceStartMode.Automatic; 

     //# This must be identical to the WindowsService.ServiceBase name 
     //# set in the constructor of WindowsService.cs 
     serviceInstaller.ServiceName = "Client Service"; 

     this.Installers.Add(serviceProcessInstaller); 
     this.Installers.Add(serviceInstaller); 
    } 

    public override void Commit(System.Collections.IDictionary savedState) { 
     base.Commit(savedState); 

     ServiceController controller = new ServiceController("Client Service"); 
     if(controller.Status != ServiceControllerStatus.Running) { 
      controller.Start(); 
     } 

     ProxySettings proxy = new ProxySettings(); 
     proxy.EnableProxy("127.0.0.1:8889"); 
    } 

    public override void Uninstall(System.Collections.IDictionary savedState) { 
     base.Uninstall(savedState); 

     ProxySettings proxy = new ProxySettings(); 
     proxy.DisableProxy(); 
    } 
} 

在提交我开始工作正常服务的覆盖,但由于某种原因,我没有看到对注册表的更改。

太确保类是初始化和解雇我加

System.Diagnostics.Process.Start("http://www.microsoft.com"); 

到两个EnableProxy和DisableProxy方法。在安装期间,网站打开并在卸载过程中,但注册表保持不变。

我在做什么错?为什么它可以作为控制台应用程序运行,但不在安装程序中运行?

好的,我已经知道发生了什么事。

我将安装程序设置为安装Everyone。我尝试安装并选择Just Me,它工作。

我想这是有道理的,因为我为当前用户设置了注册表项,但是正在为所有人安装。这听起来正确吗?

无论如何,我现在有更多的测试来检查软件是否能正确运行,如果安装了Just Me。该应用程序是一个Windows服务。

+0

这是有道理的 - 当您安装“For Everyone”时,它将在所有用户配置文件下安装,而不是当前用户配置文件,因此'Registry.CurrentUser'不会在您想要的位置上执行。 – Aaronaught 2010-01-18 18:48:35

我无法确定它为什么在控制台应用程序中运行,而不是安装程序,但我注意到您既没有配置也没有直接刷新注册表项。

尝试用这个(类似与DisableProxy和)替换代码在你EnableProxy并看看会发生什么:

using (RegistryKey registry = Registry.CurrentUser.OpenSubKey(
    "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true)) 
{ 
    registry.SetValue("ProxyEnable", 1); 
    registry.SetValue("ProxyServer", proxy); 
} 

(这是其中的原因很多,为什么你应该总是处置的IDisposable

+0

感谢您的建议。但是,这并没有改变。 – modernzombie 2010-01-18 17:14:33