Как я могу создать пользовательский интерфейс MSI, который позволяет отменить установку определенного экземпляра при запуске в режиме обслуживания

StackOverflow https://stackoverflow.com/questions/9398975

Вопрос

Мы создаем установщик с использованием WIX 3.6 для приложения Silverlight / WCF.Нам требуется возможность установки нескольких экземпляров, чтобы предоставить, например"Живой", "Тестовый" и "Демо".Каждый экземпляр должен иметь возможность запускать другую версию и обновляться независимо.Это позволяет установить новую версию в режиме "Test" перед обновлением в режиме "Live".

Я использую механизм InstanceTransforms для переключения ProductCode и CustomActions для переключения UpgradeCode до 10 экземпляров.

Мне также удалось создать пользовательский интерфейс, настроив MaintenanceTypeDlg, чтобы разрешить установку нового экземпляра без использования командной строки.Я устанавливаю MSINEWINSTANCE=1 и TRANSFORMES=:Instance, где Instance является первым из моих экземпляров, который не может быть найден в реестре перед ExecuteInstall.

Я также могу обновить экземпляр по умолчанию по основному пути обновления.Параметры удаления и восстановления в разделе Установка и удаление программ также работают корректно.

Где у меня возникают проблемы, так это в создании механизма для обновления, ремонта или удаления определенного экземпляра из диалогового окна Обслуживания.

Я создал поле со списком, которое заполняется с помощью CustomAction идентификатором и именами всех установленных экземпляров, но я не могу найти способ надежной передачи этой информации из InstallUISequence в InstallExecuteSequence.

Я попытался указать TRANSFORMES=:Instance, но сервер MSI удаляет это свойство.Я попытался указать MSIINSTANCEGUID={[SelectedGuid]}, но сервер MSI жалуется, что это недопустимое использование свойства, поскольку это не установка с несколькими экземплярами.

Мне удалось выполнить установку обновления определенного экземпляра, работающего с использованием командной строки с TRANSFORMES=:InstancetoUpgrade и перезаписывающего свойство, установленное UpgradeTable, на правильный код продукта экземпляра, однако он кэширует ПРЕОБРАЗОВАНИЯ и всегда применяет это преобразование, если в командной строке не указано TRANSFORMES= .Политика TransformsSecure установлена, но мы не сможем изменить эту политику на сайтах клиентов.

Мне не удалось найти какую-либо документацию или примеры для MSI или WIX, которые показывают правильные свойства для установки между InstallUISequence и InstallExecuteSequence, чтобы заставить сервер обновить, восстановить или удалить экземпляр, отличный от экземпляра по умолчанию в MSI, из которого был запущен пользовательский интерфейс.

Если кому-нибудь удалось заставить этот или аналогичный аспект MSIS с несколькими экземплярами работать, пожалуйста, опубликуйте любые образцы пользовательских действий, свойств и т.д. Или подсказки о том, как заставить это работать.

Редактировать:

Мне удалось получить новую версию MSI для обновления определенного экземпляра, установив свойства:UPGRADEFOUND={PreviousInstanceGUID} ПРЕОБРАЗОВАНИЯ=:Экземпляр;

Однако, если я попытаюсь снова запустить MSI для обновления, преобразование экземпляра разницы уже установлено на тот, который я только что обновил.Мой пользовательский интерфейс не может отличить MSI от двойного щелчка или запуска из скрипта для обновления / ремонта определенного экземпляра.Также похоже, что MSI игнорирует любые изменения свойства TRANSFORMES при переключении на сервер при работе в режиме обслуживания.Мне нужен способ справиться с тем фактом, что для некоторых экземпляров он будет находиться в режиме обслуживания, а для других - в режиме обновления.По сути, мне нужно иметь возможность повторно запускать FindRelatedProducts и AppSearch, когда в пользовательском интерфейсе выбран экземпляр difference.

Это было полезно?

Решение

Статья, которую я нашел по адресу http://www.codeproject.com/Articles/37825/WIX-SSRS-Custom-Assembly-Installer это была самая большая помощь в том, чтобы все заработало.

Похоже, что шаг, который я пропустил, заключался в установке MSINEWINSTANCE=1 как для обновлений, так и для установок.

Пример проекта code использует пользовательские действия для определения того, какие экземпляры уже установлены, и заполняет пользовательскую таблицу MSI результатами, а также заполняет список экземпляров.Это имеет дополнительное преимущество в том, что не требует большого количества общедоступных свойств с элементами RegSearch для поиска установленных экземпляров.

Второе пользовательское действие вызывается при нажатии следующей кнопки диалогового окна Выбора экземпляра.Это устанавливает значения TRANSFORMS, Installed, MSINEWINSTANCE, NEWPRODUCTFOUND, UPGRADEFOUND и MIGRATE в соответствующие значения.Он дублирует некоторые функциональные возможности FindInstalledProducts.Ключевыми значениями являются:

Новый Экземпляр:

session["TRANSFORMS"] = string.Format(":{0}", nextAvailableInstance);
session["Installed"] = "";                                  
session["MSINEWINSTANCE"] = "1";
session["NEWERPRODUCTFOUND"] = "";
session["UPGRADEFOUND"] = instance.ProductCode;
session["MIGRATE"] = instance.ProductCode;

Та же версия (Техническое обслуживание):

session["TRANSFORMS"] = string.Format(":{0}", selectedInstance);
session["Installed"] = "1";
session["NEWERPRODUCTFOUND"] = "";
session["UPGRADEFOUND"] = "";
session["MIGRATE"] = "";

Более новая версия уже установлена:(Должна выдавать ошибку понижения рейтинга)

session["TRANSFORMS"] = string.Format(":{0}", selectedInstance);
session["Installed"] = "1";
session["NEWERPRODUCTFOUND"] = instance.ProductCode;
session["UPGRADEFOUND"] = "";
session["MIGRATE"] = "";

Установлена более старая версия:(Обновление)

session["Installed"] = "";
session["MSINEWINSTANCE"] = "1";
session["NEWERPRODUCTFOUND"] = "";
session["UPGRADEFOUND"] = instance.ProductCode;
session["MIGRATE"] = instance.ProductCode;

В примере code project диалоговое окно выбора экземпляра отображалось в виде всплывающего окна в последовательности Подготовки, поэтому оно запускается перед FindRelatedProducts и AppSearch.Это также можно отобразить, нажав кнопку Назад в MaintenanceTypeDlg.Однако при попытке вставить его в последовательность других диалоговых окон возникают проблемы, поэтому я сделал это обычным диалогом последовательности, и он все еще работает.

Чтобы корректно работать, ПРЕОБРАЗОВАНИЯ должны быть установлены для всех экземпляров, поэтому экземпляр по умолчанию никогда не устанавливается.Для этого необходимо создать фиктивный ProductCode, отличный от любого другого ProductCode.Я использовал соглашение Wix "*".У меня есть код обновления по умолчанию, такой же, как и первый преобразованный код обновления, но это, вероятно, должно отличаться, и может даже сработать, чтобы опустить его.

Я также обнаружил, что мне нужно заполнить UpgradeTable с помощью CustomAction с UpradeCode конкретного экземпляра, чтобы избежать попыток удалить все остальные экземпляры при обновлении.

Другие советы

Если вы не подавляете ARP, каждый экземпляр должен получить свою собственную запись в «Установка и удаление программ», а при нажатии кнопки «Изменить» перейти в режим обслуживания, уникальный для ProductCode этих экземпляров.

Я что-то упустил?Возможно, вы подавляете (ARPSYSTEMCOMPONENT) и хотите написать единый пользовательский интерфейс, обслуживающий все экземпляры.ЕСЛИ это так, это можно сделать, но это было бы намного сложнее, чем несколько вопросов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top