Обновление службы Windows в режиме без вывода сообщений - PullRequest
5 голосов
/ 04 января 2011

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

Ответы [ 3 ]

5 голосов
/ 04 января 2011

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

  1. Поместите логику обновления в отдельную DLL.
  2. Создание домена приложения внутри вашей службы.
  3. Создание монитора файлов, который запускает событие при каждом копировании этого файла (вы можете использовать MSFT Ent Lib Updates)
  4. Выгрузить старую DLL при блокировке (очередь) потоки, которые выполняют вещи из этой dll
  5. Загрузка нового файла dll в домен приложения.
  6. Дайте знать вашим потокам, чтобы продолжить обработку.
3 голосов
/ 04 января 2011
  1. Загрузите новый exe и любые дополнительные сборки.
  2. Переименуйте ваши существующие сборки.
  3. Скопируйте в новую сборку.
  4. Перезапустите Сервис. Вы можете встроить функцию перезапуска службы в свой основной 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 голос
/ 04 января 2011

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

Таким образом, вы получите:

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

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

...