Я хочу, чтобы моя служба C # Windows автоматически обновляла себя

StackOverflow https://stackoverflow.com/questions/106765

  •  01-07-2019
  •  | 
  •  

Вопрос

Существует ли платформа, которую можно использовать, чтобы позволить службе C # Windows автоматически проверять наличие более новой версии и обновлять саму себя?Я, конечно, могу написать код для достижения этой цели, но я ищу фреймворк, который уже был реализован и (что наиболее важно) протестирован.

[редактировать] Вот ссылка на аналогичный вопрос со ссылками на современные проекты, которые помогают достичь этого: Библиотека автоматического обновления для .NET?

Это было полезно?

Решение

Единственный способ выгрузить типы - это уничтожить appdomain.Для этого потребуется отделить ваш уровень хостинга от вашего исполняемого сервисного кода - это довольно сложно.(что-то вроде операции с замочной скважиной)

Может быть проще либо а) запустить пакетную задачу, либо б) обнаружить обновления в службе, затем запустить отдельный процесс, который останавливает службу, обновляет сборки и т.д.затем перезапускает его.

Если вас интересует первое, специалисты по шаблонам и практикам MSDN написали блок обновления приложений, который вы адаптируете к своему сервису.

https://web.archive.org/web/20080506103749/http://msdn.microsoft.com/en-us/library/ms978574.aspx

Другие советы

Я не знаю никаких фреймворков, которые облегчали бы решение этой конкретной проблемы.

Однако что вы могли бы попробовать, так это разделить бизнес-логику сервиса из фактического кода сервиса на разные сборки.Попросите сервисную сборку регулярно проверять наличие обновлений в сборке бизнес-логики, при необходимости скопируйте ее из удаленного источника, выгрузите старую сборку BL (и, возможно, удалите), а затем динамически загрузите новую версию (выгрузка старой сборки - нетривиальная задача).

Другим возможным решением является создание отдельной службы, которая запускается, останавливает другую, если есть обновление, а затем обновляет службу.Вы не можете обновить саму службу, потому что .запущенная библиотека DLL не остановится.

Хорошим вариантом было бы разделение уровня бизнес-логики.Вы также можете переписать основную службу для запуска в режиме отражения главной службой или службой управления.Это похоже на разделение бизнес-логики, и для этого просто потребуется остановить поток и запустить его снова.

Я не знаю ни одного известного фреймворка, который делал бы это.Я сделал это сам, но это не публичные рамки.

Я использую wyBuild для обновления своих приложений (включая службы Windows), и это довольно круто.Действительно прост в использовании и действительно легко интегрируется с существующими приложениями.Это довольно отличная платформа автоматического обновления...

http://wyday.com/wybuild/help/automatic-updates/windows-services-console-apps.php http://wyday.com/wybuild/help/silent-update-windows-service.php

Обратите внимание, что это платный фреймворк (лицензия предоставляется разработчику, бесплатная пробная версия включена).

На случай, если кто-то еще ищет это;Я нашел эту ссылку интересной.Я не реализовал это решение, но, похоже, оно может сработать у меня

http://www.eggheadcafe.com/articles/20041204.asp

Не могли бы вы немного прояснить свой вопрос?Я немного сбит с толку, потому что, насколько я знаю, вы всегда можете перезаписать библиотеки DLL, используемые службой.Копирование и перезапуск службы можно легко сделать частью вашего процесса сборки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top