2008-10-22 3 views
11

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

+0

Какая среда/язык вы обслуживаете? Существует огромное различие между Win32 и .NET, когда дело доходит до решения этой проблемы ... – mdb 2008-10-22 16:32:53

+0

это приложение .net. – Matt 2008-10-22 16:36:54

ответ

21

Asp.Net использует технологию, называемую shadow copy

Если скопировать обновленный DLL в подкаталог бен приложение, в, среда ASP.NET признает, есть новый код для выполнения. Поскольку ASP.NET не может заменить dll в существующий AppDomain, он запускает новый AppDomain. Старый домен приложения «сток остановлен», то есть существующие запросы разрешены для завершения выполнения, и как только все они будут завершены, AppDomain может выгрузить. Новый AppDomain начинается с нового кода и начинает принимать все новые запросы.

Обычно, когда DLL загружается в процесс, процесс блокирует DLL, и вы не можете перезаписать файл на диске. Тем не менее, AppDomains имеет функцию, известную как Shadow Copy, которая позволяет сборкам оставаться разблокированными и сменными на диске.

Время выполнения инициализирует ASP.NET с включенным Shadow Copy для каталога bin. AppDomain скопирует любую необходимую DLL из каталога bin во временное место перед блокировкой и загрузкой dll в память. Shadow Copy позволяет перезаписывать любую DLL в каталоге bin во время обновления без отключения веб-приложения.

2

В дополнении к ответу Gulzar в:

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

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

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

-2

Когда процесс загрузил DLL это не возможно, чтобы изменить его.

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

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

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

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

Смежные вопросы