Удаление C # Windows Service - Использование программы удаления - PullRequest
2 голосов
/ 25 января 2010

Я создал проект установки для моей службы Windows.Он устанавливается нормально, однако, если я удаляю проект (либо путем добавления / удаления программ, либо щелкаю правой кнопкой мыши проект установки в VS - Uninstall), он, похоже, не удаляет службу.удалите в командной строке, чтобы сделать это, а затем перезапустите.

Я что-то настроил неправильно?

Ответы [ 3 ]

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

В своем классе Installer (который вы вызываете из своих пользовательских действий), убедитесь, что вы переопределяете метод UnInstall и вызываете <pathToFramework>\InstallUtil.exe /u <pathToServiceExe> для удаления службы.

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

Взгляните на ServiceInstaller документацию по MDSN. Вы добавляете класс, унаследованный от System.Configuration.Install.Installer, создаете ServiceInstaller и добавляете этот ServiceInstaller в свойства Установщиков.

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

Пример класса установщика:

/// <summary>
/// The installer class for the application
/// </summary>
[RunInstaller(true)]
public class MyInstaller : Installer
{
    /// <summary>
    /// Constructor for the installer
    /// </summary>
    public MyInstaller()
    {
        // Create the Service Installer
        ServiceInstaller myInstaller = new ServiceInstaller();
        myInstaller.DisplayName = "My Service";
        myInstaller.ServiceName = "mysvc";

        // Add the installer to the Installers property
        Installers.Add(myInstaller);
    }
}
0 голосов
/ 25 января 2010

Я не уверен, есть ли простой способ сделать это в проекте установки, но вот как мы это делаем в коде. Наш сервис внутренне выполняет удаление, когда вы передаете «/ uninstall» в командной строке.

public static readonly string UNINSTALL_REG_KEY = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
public static readonly string UNINSTALL_REG_GUID = "{1C2301A...YOUR GUID HERE}";

using (RegistryKey parent = Registry.LocalMachine.OpenSubKey(UNINSTALL_REG_KEY, true))
{
    try
    {
        RegistryKey key = null;

        try
        {
            key = parent.OpenSubKey(UNINSTALL_REG_GUID, true);
            if (key == null)
            {
                key = parent.CreateSubKey(UNINSTALL_REG_GUID);
            }

            Assembly asm = typeof (Service).Assembly;
            Version v = asm.GetName().Version;
            string exe = "\"" + asm.CodeBase.Substring(8).Replace("/", "\\\\") + "\"";

            key.SetValue("DisplayName", DISPLAY_NAME);
            key.SetValue("ApplicationVersion", v.ToString());
            key.SetValue("Publisher", "Company Name");
            key.SetValue("DisplayIcon", exe);
            key.SetValue("DisplayVersion", v.ToString(2));
            key.SetValue("URLInfoAbout", "http://www.company.com");
            key.SetValue("Contact", "support@company.com");
            key.SetValue("InstallDate", DateTime.Now.ToString("yyyyMMdd"));
            key.SetValue("UninstallString", exe + " /uninstallprompt");
        }
        finally
        {
            if (key != null)
            {
                key.Close();
            }
        }
    }
    catch (Exception ex)
    {
        throw new Exception(
            "An error occurred writing uninstall information to the registry.  The service is fully installed but can only be uninstalled manually through the command line.",
            ex);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...