Проект установки .NET - Изменение настроек реестра - PullRequest
1 голос
/ 15 января 2010

У меня есть класс, который изменяет разделы реестра ProxyEnable и ProxyServer в настройках Интернета.

Если я использую этот класс в консольном приложении и запускаю его, значения меняются, и я вижу изменения с помощью regedit.

Теперь часть, которая не работает, я пытаюсь использовать этот класс в классе Installer, чтобы ключи реестра изменялись во время установки моего приложения.

Вот код для класса:

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);
    }
}

Вот мой класс установщика:

[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();
    }
}

В переопределении Commit я запускаю службу, которая работает нормально, но по какой-то причине я не вижу изменений в реестре.

Просто убедитесь, что класс инициализируется и запускается. Я добавил

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

для методов EnableProxy и DisableProxy. Во время установки сайт открылся, а также во время удаления, но реестр остался без изменений.

Что я делаю не так? Почему он будет работать как консольное приложение, а не как установщик?

Ответы [ 2 ]

2 голосов
/ 18 января 2010

Не могу с уверенностью сказать, почему оно работает в Консольном приложении, а не в установщике, но я заметил, что вы не удаляете и не удаляете напрямую ключ реестра.

Попробуйте заменить код в EnableProxy этим (и аналогично DisableProxy) и посмотрите, что произойдет:

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

(Это одна из многих причин, почему вы всегда должны распоряжаться IDisposable)

0 голосов
/ 18 января 2010

Хорошо, я понял, что происходит.

У меня был установлен установщик для установки для всех. Я попытался установить и выбрать Just Me, и это сработало.

Полагаю, это имеет смысл, поскольку я настраивал раздел реестра для текущего пользователя, но устанавливал для всех. Это звучит правильно?

В любом случае, теперь у меня есть еще несколько тестов, чтобы проверить, будет ли программное обеспечение работать правильно, если оно установлено для Just Me. Приложение является службой Windows.

...