2010-10-07 4 views
1

Я создал проект настройки WiX, основанный на статье WiX 3 Tutorial: Understanding main WXS and WXI file, главным образом потому, что он дает WiX необходимое для завершения работы приложения.WiX CloseApplication для exe и dll

Однако, я озадачен результатом. Вот так:

У нас есть исполняемый файл, который использует dll и создает установку, которая устанавливает исполняемый файл и dll. Мы выполняем настройку.

CASE 1: Затем мы сменим исполняемый файл и NOT dll и снова создадим настройку. Затем мы запускаем установленное приложение и удостоверяемся, что также загружена dll. Если мы сейчас выполним вторую настройку, появится диалоговое окно с просьбой выключить исполняемый файл так, как мы ожидали.

CASE 2: Но если мы не изменим приложение, а только DLL, а затем выполним настройку во время работы приложения, и DLL будет загружена, диалог не будет показан. В конце настройки появится диалоговое окно с вопросом, хотим ли мы перезагрузить компьютер.

Является ли это ожидаемым поведением и как я могу заставить диалоговое окно выключения приложения CASE 1 также, когда изменяется только dll, как в CASE 2? Я не хочу, чтобы пользователь перезагружал компьютер, потому что приложение работает на сервере, который нельзя перезапустить.

ответ

0

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

Несколько дополнительных пунктов:

Убедитесь, что вы версий вашего EXE и DLL. Если старый DLL 1.0.0.0, а новая DLL - 1.0.0.0, то будет сказано: «Здесь ничего не делать».

Как EXE использует DLL во время выполнения? Это может просто не иметь блокировки на протяжении всей жизни процесса.

Поймите, что поведение перезагрузка MSI может быть изменена за счет использования свойств, таких как REBOOT = ReallySuppress

Вот несколько хороших статей читать:

InstallValidate FileInUseDialog System Reboots

0

Я не проверил код, но я думаю, что действие CloseApplication не выполняется, потому что он видит, что exe не изменился. Насколько мне известно, вы не можете настроить таргетинг на DLL с помощью CloseApplication. Если вы запустите свою установку с помощью журнала, вы сможете увидеть, активировано ли действие. Я предполагаю, что у вас есть расписание RemoveExistingProducts в конце установки, если вы должны были перенести его после InstallValidate, он каждый раз удалял exe и, следовательно, запускал действие.

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