2

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

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

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

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

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

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

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

Мне удалось получить установку обновления конкретного экземпляра, работающего с использованием командной строки с помощью TRANSFORMS =: InstancetoUpgrade и перезаписывания свойства, установленного UpgradeTable, в правильный экземпляр ProductCode, однако он кэширует TRANSFORMS и всегда применяет это преобразование если в командной строке не указано TRANSFORMS =. Политика TransformsSecure установлена, но мы не сможем изменить эту политику на сайтах клиентов.

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

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

EDIT:

мне удалось получить новую версию MSI для обновления конкретного экземпляра, установив свойства: UPGRADEFOUND = {PreviousInstanceGUID} трансформирует =: Instance;

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

ответ

2

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

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

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

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

New Instance:

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

Same Version (Maintenance):

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; 

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

Для правильной работы ТРАНСФОРМЫ необходимо установить для всех экземпляров, поэтому экземпляр по умолчанию никогда не устанавливается. Фиктивный ProductCode нуждается в создании для этого отличного от любого другого ProductCode. Я использовал соглашение Wix «*». У меня есть версия UpgradeCode по умолчанию, такая же, как и первый преобразованный код обновления, но это, вероятно, должно быть другим, и может даже работать, чтобы опустить его.

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

0

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

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

+0

Я подавляю ARPMODIFY, но я получаю запись для каждого экземпляра в «Установка и удаление программ». Я могу восстановить и удалить экземпляр оттуда без каких-либо проблем.Однако то, что мне нужно сделать, это выбрать конкретный экземпляр при запуске новой версии MSI для выборочного обновления экземпляров. – Alban

+0

«При запуске новой версии», которая звучит как запуск MSI для меня. Я почему-то думал о ARP. Ознакомьтесь с: http://blog.deploymentengineering.com/2006/10/multiple-instance-msis-and.html и http://blog.deploymentengineering.com/2008/03/installshield-2009-beta-part-i .html –

+0

Я написал, что много лет назад и совсем недавно был рабочий пример, написанный на C# с использованием Microsoft.Deployment.WindowsInstaller. C# отлично подходит для меня, потому что я только Server 2008 R2 на моей дневной работе. Я не уверен, какая поддержка Burn для обслуживания нескольких экземпляров в WiX 3.6. –

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