Установите несколько экземпляров MSI с именем динамического экземпляра

В нашем продукте есть установщик MSI (написанный в WiX), который в основном копирует некоторые файлы в папку c:\ourproduct и устанавливает службу Windows "наш интерфейс".

Мы хотели бы добавить поддержку нескольких экземпляров службы, и их можно будет устанавливать и удалять независимо друг от друга. Аналогично, например, для SQL Server каждый экземпляр должен иметь имя, которое может быть передано MSI в качестве параметра командной строки.

Пример: экземпляр "A" = > скопировать файлы в "c:\ourproductA", установить сервис как "ourwindowsserviceA" экземпляр "B" = > скопировать файлы в "c:\ourproductB", установить сервис как "ourwindowsserviceB" ...

Любая идея?

Преобразование экземпляров, по-видимому, требует предопределенного и предварительно заданного набора экземпляров.

Спасибо

Ответ 1

Столбец таблицы ServiceInstall является форматированным типом. Это означает, что вы можете использовать свойства во время выполнения, чтобы управлять именем.

Несколько лет назад я написал статью в блоге о нескольких установщиках экземпляров. В комментариях кто-то спросил о динамическом количестве экземпляров, и я говорю о том, что нужно сделать. В основном вам придется написать файл bootstrapper.exe с пользовательским интерфейсом и может привести к созданию преобразований с уникальными свойствами. Использование С# и WiX/DTF для вашего MSI Interop это действительно вполне возможно. Я просто никогда не чувствовал необходимости на самом деле делать это. Я был полностью доволен Продуктом, Продуктом-1... Продукт-15, и все готово. Короткие сокращения должны выполняться пользовательским действием, поскольку они не поддерживают тип Formatted, но INSTALLDIR может быть изменен, а ServiceNames поддерживают форматирование.

Ответ 2

К сожалению, указанная вами статья верна, Windows Installer не поддерживает динамические экземпляры. Даже коммерческие инструменты, поддерживающие несколько экземпляров, требуют определения экземпляров с самого начала. Поэтому в вашем случае вам нужно будет определить экземпляры A, B, C и т.д. Вручную, прежде чем создавать установщик.

Это связано с тем, что продукт идентифицируется его ProductCode (между прочим), поэтому вам нужно применить преобразование к MSI, которое изменяет идентификатор. Очень сложно создавать преобразования на лету, потому что вам нужны специальные инструменты или API-интерфейс Windows Installer, который обычно не найден на пользовательской машине.

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