2008-09-20 11 views
27

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

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

+0

я нашел сообщение в блоге «Создание автоматического обновления приложения в .NET/C# "(http://www.nerdparadise.com/tech/csharp/autoupdatingapp/) со ссылкой на код. Это для приложения, а не для службы, но я уверен, что он может быть легко обновлен для работы. – 2012-08-08 18:26:20

ответ

16

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

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

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

http://msdn.microsoft.com/en-us/library/ms978574.aspx

+0

Я удивлен, что, как и сегодня, через 3 года нет простого решения. Спасибо stepbu. – Sauleil 2011-11-01 20:05:35

+0

Выгрузка типа очень сложная. Это включало бы разматывание всех экземпляров этого типа в памяти, а также любую ссылку на этот экземпляр, например. членов и свойств в других случаях. Побочный эффект, который может быть очень непредсказуемым в умеренно сложном приложении. Выгрузите решение addomain для решения этой проблемы, вместо того чтобы сделать недействительной всю память в этом приложении. Оставляя вас рассматривать только одну (хотя и большую, но детерминированную) проблему. – stephbu 2011-11-05 02:45:21

-1

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

+0

Извините за путаницу. Я хотел бы, чтобы мой сервис опросил обновления и самостоятельно установил их при их обнаружении. У меня много сервисов на многих серверах (контролируемых доступом), и я очень устал от халата и риска ручных вмешательств. – 2008-09-20 05:44:25

3

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

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

2

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

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

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

2

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

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

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