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

Мы создаем установщик, использующий 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, когда в пользовательском интерфейсе выбран экземпляр различий.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

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

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

Пример проекта кода использует настраиваемые действия, чтобы определить, какие экземпляры уже установлены, и заполняет настраиваемую таблицу MSI результатами, а также заполняет экземпляры ListBox.Это дает дополнительное преимущество: не требуется много открытых свойств с элементами 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;

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

Для правильной работы необходимо установить TRANSFORMS для всех экземпляров,поэтому экземпляр по умолчанию никогда не устанавливается.Для этого необходимо создать фиктивный код продукта, отличный от любого другого кода продукта.Я использовал соглашение Wix "*".У меня UpgradeCode по умолчанию такой же, как первый преобразованный код обновления, но, вероятно, он должен отличаться, и он может даже работать, чтобы его пропустить.

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

0 голосов
/ 23 февраля 2012

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

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

...