.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服务。
我无法确定它为什么在控制台应用程序中运行,而不是安装程序,但我注意到您既没有配置也没有直接刷新注册表项。
尝试用这个(类似与DisableProxy
和)替换代码在你EnableProxy
并看看会发生什么:
using (RegistryKey registry = Registry.CurrentUser.OpenSubKey(
"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", true))
{
registry.SetValue("ProxyEnable", 1);
registry.SetValue("ProxyServer", proxy);
}
(这是其中的原因很多,为什么你应该总是处置的IDisposable
)
感谢您的建议。但是,这并没有改变。 – modernzombie 2010-01-18 17:14:33
这是有道理的 - 当您安装“For Everyone”时,它将在所有用户配置文件下安装,而不是当前用户配置文件,因此'Registry.CurrentUser'不会在您想要的位置上执行。 – Aaronaught 2010-01-18 18:48:35