Удаление службы - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет...Проблема вот в чем: Я написал некую службу, и мне необходимо её удалить программно... Делаю так:
static void Main(string[] args)
{
   if (args.Length > 0)
   {
      if (args[0] != null && args[0].ToLower() == "/uninstall") UnInstall();
   }
   else
   {
      // Запуск службы //
   }
}
 
private static void UnInstall()
{
   TransactedInstaller ti = new TransactedInstaller();
   ProjectInstaller mi = new ProjectInstaller();
   ti.Installers.Add(mi);
   String path = String.Format("/assemblypath={0}", Assembly.GetExecutingAssembly().Location);
   String[] cmdline = { path };
   InstallContext ctx = new InstallContext("", cmdline);
   ti.Context = ctx;
   ti.Uninstall(null);
}
Так вот...если я запускаю мой файл сервиса с параметром /uninstall, то служба удаляется...Всё как должно быть...Но мне нужно, чтоб сервис сам себя удалил, поэтому делаю так:
static void Main(string[] args)
{
   if (args.Length > 0)
   {
      if (args[0] != null && args[0].ToLower() == "/uninstall") UnInstall();
   }
   else
   {
      // Запуск службы //
      if (delete)//Если нужно удалить
      {
         string filename = path + @"\MyService.exe"; //Путь до файла
         string delname = path + @"\delete.exe"; //Программа, которая запустит файл с параметром /uninstall
         Process proc = new Process();
         proc.StartInfo.WorkingDirectory = path;
         proc.StartInfo.FileName = delname;
         proc.StartInfo.Arguments = filename;
         proc.Start();
      }
   }
}
Соответственно вот код файла delete.exe
static void Main(string[] args)
{
   if (args.Length > 0)
   {
      string filename = args[0];
      if(!new FileInfo(filename).Exist)return;
      Thread.Sleep(10000);//Ждём чтоб служба остановилась
      Process.Start(filename, "/uninstall");
   }
}
Так вот...если я сам запущу файл delete.exe, то служба удалится, но если этот файл был запущен из сервиса (как и должно быть), то служба не удаляется. ti.Uninstall(null); выдаёт исключение:
При удалении из системы возникло исключение. Это исключение будет проигнорировано, и удаление из системы будет продолжено. Однако после завершения удаления данное приложение может оказаться не полностью удаленным. в System.Configuration.Install.Installer.Uninstall(IDictionary savedState) в System.Configuration.Install.TransactedInstaller.Uninstall(IDictionary savedState) в WiWUpdateService.Program.UnInstall()
Как решить даннуж пробему?

Решение задачи: «Удаление службы»

textual
Листинг программы
private static void UnInstall(string serviceName, int timeoutMilliseconds, string path)  
{
  ServiceController service = new ServiceController(serviceName);
  try
  {
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
 
    service.Stop();
    service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
    Process.Start(path, "/uninstall");
  }
  catch
  {
    // ...
  }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5