Я хочу обновить dll для серверного процесса, не останавливая службу. Как я могу это сделать? Немного похоже на то, как asp.net автоматически подбирает новые библиотеки DLL, помещенные в папку bin.
Обратите внимание, что хотя asp.net, похоже, продолжает работать, активность пользователя все еще может быть прервана и вызвать потерю работы, когда новые библиотеки DLL помещаются в папку bin.





Asp.Net использует технику под названием теневая копия
Если вы скопируете обновленную dll в подкаталог bin приложения, среда выполнения ASP.NET обнаружит, что нужно выполнить новый код. Поскольку ASP.NET не может заменить DLL в существующий домен приложений, он запускает новый домен приложений. Старый домен приложения «остановлен», то есть существующим запросам разрешено завершить выполнение, и как только они будут завершены, AppDomain может выгружаться. Новый домен приложений начинается с нового кода и начинает принимать все новые запросы.
Обычно, когда DLL загружается в процесс, процесс блокирует DLL, и вы не можете перезаписать файл на диске. Однако домены приложений имеют функцию, известную как теневое копирование, которая позволяет сборкам оставаться разблокированными и заменяемыми на диске.
Среда выполнения инициализирует ASP.NET с включенным теневым копированием для каталога bin. AppDomain скопирует любую необходимую dll из каталога bin во временное место перед блокировкой и загрузкой dll в память. Shadow Copy позволяет нам перезаписывать любую dll в каталоге bin во время обновления, не переводя веб-приложение в автономный режим.
Взгляните на выпуск № 5 «Спящих носорогов»: ayende.com/hibernating-rhinos.aspx
Подкасты Hibernating Rhinos перемещены. См. Этот пост от Айенде с описанием их нового местоположения по состоянию на май 2011 г .: ayende.com/blog/4838/hibernating-rhinos-webcasts
В дополнение к ответу Гульзар:
Если ваша служба просто напрямую ссылается на библиотеки DLL, вам необходимо немного перепроектировать службу, чтобы использовать домены приложений и возможности ShadowCopy, чтобы воспользоваться этой функцией.
Мы делаем что-то вроде этого, когда сервис - это просто процесс оболочки / хоста. Вся функциональность загружается в отдельные домены приложений по мере необходимости.
Когда процесс загрузил dll, изменить ее невозможно.
IIS не хранит DLL, загруженную в память, когда она не используется (затронутый свойством Cache), и я предполагаю, что то же самое и в случае с ASP.NET. Если вы последуете той же стратегии, вы также сможете обновить свои библиотеки DLL.
Однако, если ваши библиотеки DLL используются, у вас должен быть способ указать процессу сервера выгрузить все ваши библиотеки DLL.
Для этого серверный процесс должен загрузить все библиотеки DLL с помощью вызовов LoadLibrary, чтобы он мог выгрузить их при получении сообщения с просьбой сделать это.
Взаимодействие с серверным процессом может быть выполнено путем создания глобально доступного именованного события, к которому может получить доступ новая программа и которое будет использоваться для сигнализации запущенному процессу о том, что должно произойти обновление. (Вы также можете подумать о других вариантах этого).
В какой среде / на каком языке написана ваша служба? Когда дело доходит до решения этой проблемы, между Win32 и .NET огромная разница ...