Обновите dll без остановки службы

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

В какой среде / на каком языке написана ваша служба? Когда дело доходит до решения этой проблемы, между Win32 и .NET огромная разница ...

mdb 22.10.2008 20:32

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

StingyJack 15.02.2018 19:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
2
8 217
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

asgerhallas 21.08.2009 22:32

Подкасты Hibernating Rhinos перемещены. См. Этот пост от Айенде с описанием их нового местоположения по состоянию на май 2011 г .: ayende.com/blog/4838/hibernating-rhinos-webcasts

Jeff Fritz 25.09.2012 16:53

В дополнение к ответу Гульзар:

Если ваша служба просто напрямую ссылается на библиотеки DLL, вам необходимо немного перепроектировать службу, чтобы использовать домены приложений и возможности ShadowCopy, чтобы воспользоваться этой функцией.

Мы делаем что-то вроде этого, когда сервис - это просто процесс оболочки / хоста. Вся функциональность загружается в отдельные домены приложений по мере необходимости.

http://blogs.msdn.com/junfeng/archive/2004/02/09/69919.aspx

Когда процесс загрузил dll, изменить ее невозможно.

IIS не хранит DLL, загруженную в память, когда она не используется (затронутый свойством Cache), и я предполагаю, что то же самое и в случае с ASP.NET. Если вы последуете той же стратегии, вы также сможете обновить свои библиотеки DLL.

Однако, если ваши библиотеки DLL используются, у вас должен быть способ указать процессу сервера выгрузить все ваши библиотеки DLL.

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

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

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

Похожие вопросы