Бала,
Когда вы говорите, что хотите установить App.msi после установки, я спрашиваю, управляете ли вы этим App.msi или используете инсталлятор другого пользователя. Мне интересно это потому, что если вы контролируете App.msi, я бы рекомендовал изменить его на модуль слияния и добавить выходные данные этого модуля слияния в ваш проект установщика. Это был бы самый простой план атаки, если вы писатель App.msi. Однако, если вы просто хотите установить чью-то MSI после того, как ваша закончена, вы на правильном пути. В основном причина, по которой вы получаете диалоговое окно параметров MSI, в том, что что-то не совсем правильно отформатировано. Я предполагаю, что ваше пользовательское действие неправильно обращается к MSIEXEC.EXE и, таким образом, вызывает всплывающее диалоговое окно справки. Без вашего исходного кода я не могу быть уверен в том, что конкретно не так, я могу только показать вам пример того, как я заставил его работать. Мое решение заключается в следующем:
Во-первых, давайте посмотрим на решение, если вы действительно управляете App.msi и можете преобразовать его в модуль слияния. Вот шаги, чтобы сделать это:
- Создать модуль слияния. По сути, вы просто берете материал, который вы делали в MSI, и перемещаете его в модуль слияния, они в основном совпадают с тем, как Visual Studio отображает их вам.
- Создайте свой проект MSI.
- Добавьте вывод вашего модуля слияния в ваш MSI.
- Скомпилируйте и установите MSI.
Теперь для случая, когда вы не контролируете App.msi, вот что вам нужно сделать:
- Создайте проект библиотеки классов, назовите его как хотите. Этот проект будет содержать логику для вызова вашего внешнего MSI-файла.
- Добавьте в этот проект новый элемент типа Installer Class, снова назовите этот класс как хотите.
- Удалите созданный файл Class1.vb (.cs), так как он не требуется.
- Создайте свой проект WPF (или добавьте существующий проект WPF).
- Создайте проект установки, снова назвав все, что вы хотите.
- В проекте класса щелкните правой кнопкой мыши класс установщика и просмотрите код.
- Добавьте код в свой класс для Install and Commit (см. Рисунок 1 ниже):
- В проекте установщика добавьте основной вывод из приложения WPF и библиотеку классов.
- Добавьте ваш файл App.msi в проект установщика.
- Откройте пользовательские действия, щелкните правой кнопкой мыши корневой узел пользовательских действий и нажмите «Добавить пользовательское действие ...».
- Перейдите к первичному выходу из вашего проекта wpf, нажмите OK.
- Аналогичным образом добавьте основной вывод из библиотеки классов.
- Выберите основной вывод из библиотеки классов под узлом установки и просмотрите его свойства.
- В поле CustomActionData введите это:
/OtherMSIPath="[TARGETDIR]\App.msi"
- Убедитесь, что в поле InstallerClass установлено значение True.
- Сборка и установка приложения.
Рисунок 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 .
Надеюсь, это поможет,
Спасибо!