Я хочу, чтобы моя служба Windows C # автоматически обновлялась - PullRequest
31 голосов
/ 20 сентября 2008

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

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

Ответы [ 6 ]

16 голосов
/ 20 сентября 2008

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

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

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

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

3 голосов
/ 20 сентября 2008

Мне неизвестны какие-либо фреймворки, способствующие решению этой конкретной проблемы.

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

2 голосов
/ 01 октября 2012

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

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

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

2 голосов
/ 20 сентября 2008

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

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

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

1 голос
/ 18 ноября 2008

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

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

0 голосов
/ 20 сентября 2008

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

...