Мы создаем установщик, использующий WIX 3.6 для приложения Silverlight / WCF.
Нам требуется возможность установки нескольких экземпляров, чтобы, например, «Живой», «Тестовый» и «Демо».
Каждый экземпляр должен иметь возможность запускать разные версии и обновляться независимо.
Это позволяет установить новую версию в «Тест» перед обновлением «Live».
Я использую механизм InstanceTransforms для переключения ProductCode и CustomActions для переключения UpgradeCode на срок до 10 экземпляров.
Мне также удалось создать пользовательский интерфейс, настроив MaintenanceTypeDlg, чтобы разрешить установку нового экземпляра без использования командной строки. Я установил MSINEWINSTANCE = 1 и TRANSFORMS =: Экземпляр, где Instance - это первый из моих экземпляров, который не может быть найден в реестре до ExecuteInstall.
Я также могу обновить экземпляр по умолчанию через основной путь обновления.
Параметры удаления и восстановления в окне «Установка и удаление программ» также работают правильно.
У меня возникают проблемы при создании механизма обновления, восстановления или удаления конкретного экземпляра из диалогового окна «Обслуживание».
Я создал ComboBox, который заполняется с помощью CustomAction с идентификатором и именами всех установленных экземпляров, но я не могу найти способ надежной передачи этой информации из InstallUISequence в InstallExecuteSequence.
Я попытался указать TRANSFORMS =: экземпляр, но MSI сервера удаляет это свойство.
Я попытался указать MSIINSTANCEGUID = {[SelectedGuid]}, но сервер MSI жалуется, что это недопустимое использование свойства, поскольку это не установка нескольких экземпляров.
Мне удалось получить установку обновления конкретного экземпляра, работающего с использованием командной строки с TRANSFORMS =: InstancetoUpgrade и перезаписать свойство, установленное в UpgradeTable, на правильный экземпляр ProductCode, однако он кэширует TRANSFORMS и всегда применяет это преобразование, если в командной строке не указано TRANSFORMS =.
Политика TransformsSecure установлена, но мы не сможем изменить эту политику на сайтах клиентов.
Мне не удалось найти какую-либо документацию или примеры для MSI или WIX, которые показывают правильные свойства, устанавливаемые между InstallUISequence и InstallExecuteSequence, чтобы заставить сервер обновлять, восстанавливать или удалять экземпляр, отличный от экземпляра по умолчанию, в MSI, с которого был запущен пользовательский интерфейс.
Если кому-то удалось настроить этот или аналогичный аспект работы MSI с несколькими экземплярами, пожалуйста, опубликуйте примеры пользовательских действий, свойств и т. Д. Или советы о том, как это работает.
EDIT:
Мне удалось получить новую версию MSI для обновления конкретного экземпляра, установив свойства:
UPGRADEFOUND = {PreviousInstanceGUID} TRANSFORMS =: Экземпляр;
Однако, если я попытаюсь запустить MSI снова, чтобы обновить экземпляр разницы, TRANSFORMS уже настроен на тот, который я только что обновил.
Мой пользовательский интерфейс не может отличить MSI от двойного щелчка или запуска от сценария для обновления / восстановления конкретного экземпляра.
Также похоже, что MSI игнорирует любые изменения свойства TRANSFORMS при переключении на сервер при работе в режиме обслуживания.
Мне нужен способ справиться с тем фактом, что для некоторых случаев он будет в режиме обслуживания, а в других - в режиме обновления.
По сути, мне нужно иметь возможность повторно запускать FindRelatedProducts и AppSearch, когда в пользовательском интерфейсе выбран экземпляр различий.