Правильный способ удаления службы Windows? - PullRequest
14 голосов
/ 08 августа 2010

У меня есть служба Windows, созданная с использованием C #, которая устанавливается через проект установки VS2008, и у меня возникла пара проблем, возникающих в процессе удаления:

Служба не остановленаперед удалением

При запуске подпрограммы удаления выдается ошибка об используемых файлах.Нажатие кнопки «Продолжить» завершает установку правильно, но служба по-прежнему отображается в списке, поэтому она не удаляется должным образом.

(В настоящее время я вынужден прибегнуть к ее удалению вручную с помощью sc delete servicename ).

Я пытаюсь остановить службу перед удалением, используя следующий код, но, похоже, он не действует:

protected override void OnBeforeUninstall(IDictionary savedState)
{
   base.OnBeforeUninstall(savedState);
   ServiceController serviceController = new ServiceController(MyInstaller.ServiceName);
   serviceController.Stop();
}

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

Папка установки не удаляется после удаления

При запуске приложение также создает некоторые файлы в папке установки.После удаления папка установки (C: \ Program Files \ MyApp) не удаляется и содержит файлы, созданные приложением, хотя все остальные файлы, фактически установленные программой установки, были успешно удалены.

Может ли процесс удаления удалить папку установки, включая все созданные файлы в этой папке, и если да, то как?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 28 января 2011

Для тех, кто ищет ответ на следующие проблемы:

Служба не остановлена ​​перед удалением

Пока не найдено решение этой проблемы..

Папка установки не удаляется после удаления

Метод OnAfterUninstall в установщике проекта необходимо переопределить, а все созданные файлы следует удалить.Папка установщика приложения автоматически удаляется, если она не содержит файлов после этого шага.

protected override void OnAfterUninstall(IDictionary savedState)
{
    base.OnAfterUninstall(savedState);

    string targetDir = Context.Parameters["TargetDir"]; // Must be passed in as a parameter

    if (targetDir.EndsWith("|"))
        targetDir = targetDir.Substring(0, targetDir.Length-1);

    if (!targetDir.EndsWith("\\"))
        targetDir += "\\";

    if (!Directory.Exists(targetDir))
    {
        Debug.WriteLine("Target dir does not exist: " + targetDir);
        return;
    }

    string[] files = new[] { "File1.txt", "File2.tmp", "File3.doc" };
    string[] dirs  = new[] { "Logs", "Temp" };

    foreach (string f in files)
    {
        string path = Path.Combine(targetDir, f);

        if (File.Exists(path))
            File.Delete(path);
    }

    foreach (string d in dirs)
    {
        string path = Path.Combine(targetDir, d);

        if (Directory.Exists(d))
            Directory.Delete(d, true);
    }

    // At this point, all generated files and directories must be deleted.
    // The installation folder will be removed automatically.
}

Помните, что папка установки должна быть передана в качестве параметра:

  • Щелкните правой кнопкой мыши по вашему проекту установки, затем выберите «Просмотр» -> «Пользовательские действия»
  • . Пользовательские действия откроются в главном окне.Щелкните правой кнопкой мыши «Первичный вывод из XXX» под узлом удаления и выберите «Окно свойств»
  • В окне свойств в разделе CustomActionData введите следующее: / TargetDir = "[TARGETDIR] |" (обратите внимание на канал в конце, не удаляйте это).

Это передаст папку установки в качестве параметра для вашей процедуры удаления, чтобы вы знали, где было установлено приложение, и можете удалитьваши сгенерированные файлы и папки.

1 голос
/ 08 августа 2010

Скорее всего, служба просто закрывается, и вы продолжаете работу до полной остановки службы. Попробуйте вызвать метод WaitForStatus (ServiceControllerStatus) .

Это приведет к тому, что ваш код будет ждать, пока служба обработает сообщение «стоп», и завершит работу. Как только служба фактически закрыта, она больше не будет удерживать какие-либо файловые дескрипторы.

0 голосов
/ 19 марта 2018

Просто следуйте ответу Мана, добавив следующий код в функцию «OnAfterUninstall», служба Windows будет удалена.

        var process = new System.Diagnostics.Process();
        process.StartInfo.FileName = "sc.exe";
        process.StartInfo.Arguments = "delete \"" + serviceName + "\"";
        process.StartInfo.CreateNoWindow = true;
        process.Start();
...