Обновите dll, не останавливая сервис

Попробуйте, пожалуйста, посмотрите, соответствует ли он вашим потребностям:

awk 'FNR==NR { le=length($1); a[le][$1]=$2; if (maxL<le) maxL=le; next } { for(le=maxL;le>0;le--) if(length(a[le])) for (i in a[le]) gsub(i, a[le][i]) }1'  "lookup.tab" "target.txt"

Он основан на ваших собственных попытках, но вместо случайной замены с использованием хэшей в массиве, сначала используйте более длинные ключи. [ 111]
Таким образом, и, основываясь на ваших примерах, я думаю, что этого достаточно, чтобы избежать ошибочных замен.

11
задан Gulzar Nazim 22 October 2008 в 16:44
поделиться

3 ответа

Asp. Сеть использует технику, названную теневой копией

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

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

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

21
ответ дан 3 December 2019 в 05:36
поделиться

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

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

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

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

2
ответ дан 3 December 2019 в 05:36
поделиться

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

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

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

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

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

-2
ответ дан 3 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

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