2011-01-04 4 views
5

Я создал службу Windows, теперь я хочу, чтобы она автоматически обновлялась. Я прочитал о создании второй службы, чтобы сделать это или другую программу, не используйте клик один, а как насчет myBuild? Кто-нибудь знает это? Каков наилучший способ? Могу ли я просто сменить сборки?Молчаливое обновление службы Windows

ответ

5

Если вы хотите, чтобы ваш сервис для запуска во время выполнения обновления, вот что я делал раньше, чтобы достичь этого:

  1. Положите вашу updateble логики в отдельный DLL.
  2. Создание AppDomain в рамках вашего сервиса.
  3. Создать монитор файла, что пожары событие всякий раз, когда вы копируете этот файл (вы можете использовать MSFT Ent Lib Updates)
  4. Выгрузка старую DLL во время блокировки (очереди) нити, которые выполняют вещи из этой библиотеки
  5. нагрузки в новый файл dll в домене приложения.
  6. Сообщите своим темам, чтобы продолжить обработку.
3
  1. Загрузить новый exe и любую дополнительную сборку.
  2. Переименуйте существующую сборку.
  3. Скопировать в вашу новую сборку.
  4. Restart Service. Вы можете создать функцию перезапуска службы в своем основном сервисе exe.
  5. Когда служба запускает проверку переименованных файлов с шага 2 и удаляет их для очистки.

Чтобы перезапустить службу сделать

System.Diagnostics.Process.Start 
    (System.Reflection.Assembly.GetEntryAssembly().Location) 

Тогда в службе сделать

private const string _mutexId = "MyUniqueId"; 
    private static Mutex _mutex; 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() 
    { 
     try 
     { 
      bool alreadyRunning = false; 
      try 
      { 
       Mutex.OpenExisting(_mutexId); 
       alreadyRunning = true; 
      } 
      catch (WaitHandleCannotBeOpenedException) 
      { 
       alreadyRunning = false; 
      } 
      catch 
      { 
       alreadyRunning = true;     
      } 
      if (alreadyRunning) 
      { 
       using (ServiceController sc = new ServiceController("MyServiceName")) 
       { 
        sc.Stop(); 
        sc.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 120)); 
        sc.Start(); 
       } 
       return; 
      } 
     } 
     catch 
     { 
     } 
     _mutex = new Mutex(true, _mutexId); 

     ServiceBase[] ServicesToRun; 
     ServicesToRun = new ServiceBase[] 
     { 
      new MyService() 
     }; 
     // Load the service into memory. 
     ServiceBase.Run(ServicesToRun); 
     _mutex.Close(); 
    } 
1

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

Таким образом, вы бы:

  • Service.exe: Запускает application.exe, отслеживает удаленное местоположение для обновления до application.exe. Отправляет события запуска/остановки в Application.exe

  • Application.exe: Каким бы ни был ваш Service.exe. Получает события запуска/остановки.

+0

... извините, вероятно, не объяснено ужасно хорошо. Написание ответов SO в 3 часа ночи, вероятно, не самая лучшая идея;) –

Смежные вопросы