Проект развертывания WPF: вызвать другую установку msi на этапе фиксации исходного установщика - PullRequest
1 голос
/ 10 ноября 2009

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

msiexec.exe / i "[SOURCEDIR] \ App.msi" / qb

Когда я запускаю приложение, я получаю окно справки, отображающее параметры MSI. Любая идея, почему установщик не запускается.

- Бала

1 Ответ

4 голосов
/ 19 ноября 2009

Бала,

Когда вы говорите, что хотите установить App.msi после установки, я спрашиваю, управляете ли вы этим App.msi или используете инсталлятор другого пользователя. Мне интересно это потому, что если вы контролируете App.msi, я бы рекомендовал изменить его на модуль слияния и добавить выходные данные этого модуля слияния в ваш проект установщика. Это был бы самый простой план атаки, если вы писатель App.msi. Однако, если вы просто хотите установить чью-то MSI после того, как ваша закончена, вы на правильном пути. В основном причина, по которой вы получаете диалоговое окно параметров MSI, в том, что что-то не совсем правильно отформатировано. Я предполагаю, что ваше пользовательское действие неправильно обращается к MSIEXEC.EXE и, таким образом, вызывает всплывающее диалоговое окно справки. Без вашего исходного кода я не могу быть уверен в том, что конкретно не так, я могу только показать вам пример того, как я заставил его работать. Мое решение заключается в следующем:

Во-первых, давайте посмотрим на решение, если вы действительно управляете App.msi и можете преобразовать его в модуль слияния. Вот шаги, чтобы сделать это:

  1. Создать модуль слияния. По сути, вы просто берете материал, который вы делали в MSI, и перемещаете его в модуль слияния, они в основном совпадают с тем, как Visual Studio отображает их вам.
  2. Создайте свой проект MSI.
  3. Добавьте вывод вашего модуля слияния в ваш MSI.
  4. Скомпилируйте и установите MSI.

Теперь для случая, когда вы не контролируете App.msi, вот что вам нужно сделать:

  1. Создайте проект библиотеки классов, назовите его как хотите. Этот проект будет содержать логику для вызова вашего внешнего MSI-файла.
  2. Добавьте в этот проект новый элемент типа Installer Class, снова назовите этот класс как хотите.
  3. Удалите созданный файл Class1.vb (.cs), так как он не требуется.
  4. Создайте свой проект WPF (или добавьте существующий проект WPF).
  5. Создайте проект установки, снова назвав все, что вы хотите.
  6. В проекте класса щелкните правой кнопкой мыши класс установщика и просмотрите код.
  7. Добавьте код в свой класс для Install and Commit (см. Рисунок 1 ниже):
  8. В проекте установщика добавьте основной вывод из приложения WPF и библиотеку классов.
  9. Добавьте ваш файл App.msi в проект установщика.
  10. Откройте пользовательские действия, щелкните правой кнопкой мыши корневой узел пользовательских действий и нажмите «Добавить пользовательское действие ...».
  11. Перейдите к первичному выходу из вашего проекта wpf, нажмите OK.
  12. Аналогичным образом добавьте основной вывод из библиотеки классов.
  13. Выберите основной вывод из библиотеки классов под узлом установки и просмотрите его свойства.
  14. В поле CustomActionData введите это:
    /OtherMSIPath="[TARGETDIR]\App.msi"
  15. Убедитесь, что в поле InstallerClass установлено значение True.
  16. Сборка и установка приложения.

Рисунок 1:

 Public Overrides Sub Install(ByVal stateSaver As System.Collections.IDictionary)
  MyBase.Install(stateSaver)

  stateSaver.Add("OtherMSIPath", Context.Parameters("OtherMSIPath"))
 End Sub

 Public Overrides Sub Commit(ByVal savedState As System.Collections.IDictionary)
  MyBase.Commit(savedState)
  System.Diagnostics.Process.Start("MSIEXEC.EXE", "/i """ & savedState.Item("OtherMSIPath").ToString & """ /qb")
 End Sub

Я добавил это в исходный код для примера ответа на этот вопрос в Google Code для загрузки. Вы можете проверить этот пример здесь , используя клиент Subversion .

Надеюсь, это поможет,

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...