2010-09-07 2 views
0

У меня есть установщик MSI, который устанавливает продукт, и этот продукт имеет несколько широко используемых API dll. Эти DLL могут быть загружены в процессы, которые я не могу контролировать во время обновления (например, я не могу попросить пользователя закрыть explorer.exe или svchost). Итак, во время обновления MSI эти dll заблокированы и не могут быть обновлены без перезагрузки. Мне нужно сделать обновление без перезагрузки. Эти API-интерфейсы очень стабильны, и можно оставить старые копии, работающие в старых процессах, когда новые версии этих dll будут загружены в новые запущенные процессы. Итак, когда мы не использовали MSI, мы просто использовали стандартный трюк - переименовать файл, пометить его, чтобы удалить при перезагрузке, написать новый файл.Как сообщить MSI обновить заблокированные DLL и избежать перезагрузки

Каков наилучший способ, как это сделать в MSI? Должен ли я создавать пользовательские действия, которые будут выполнять этот стандартный трюк? Или, может быть, у MSI есть лучший способ сделать это?

Спасибо!

ответ

1

Процессы «заблокированы», потому что они используются, и вы не можете изменить исполняемый файл во время его работы; нет «разблокировки», но прекратить использование файла. Таким образом, либо вы сейчас уничтожаете процессы, либо используете ключ PendingFileRename для изменения файла после перезагрузки ...

Возможно, вы можете попытаться убить дескрипторы/потоки, которые explorer.exe и другие должны удержать на ваших DLL (используя пользовательское действие), которое может работать в течение одной минуты ... но это обеспечило бы, что (а) ваши недавно обновленные библиотеки DLL не будут работать до перезапуска, и (b) вы, вероятно, сделали компьютер пользователя неустойчивым и Проводник мог сработать в любой момент. В любом случае, конечные пользователи не будут довольны вашим программным обеспечением ... должно быть хуже, чем они будут раздражаться при перезагрузке.

+1

Это не совсем так. Как я сказал в первом посте, я могу оставить свою старую dll загруженной в старые процессы. И только новые будут использовать новую dll. – Oleg

+0

Вы имеете в виду, что новые DLL используют новое имя и новые крючки? Хм ... – ewall