Запустите консольное приложение .NET 2.0 в настраиваемом действии WiX из двоичной таблицы - PullRequest
1 голос
/ 23 февраля 2012

Я пытаюсь запустить консольное приложение, написанное на C # .NET 2.0, с помощью специального действия в моем проекте установки WiX MSI, например:

<CustomAction Id="INSTALL_TEXT" Impersonate="yes" Return="check" Execute="immediate" BinaryKey="TextCreator.exe" ExeCommand="C:\test.txt -i"/>
<CustomAction Id="UNINSTALL_TEXT" Impersonate="yes" Return="check" Execute="immediate" BinaryKey="TextCreator.exe" ExeCommand="C:\test.txt -u"/>
<Binary Id="TextCreator.exe" SourceFile="C:\MyInstaller\Test\Tools\TextCreator.exe"/>
<InstallExecuteSequence>
  <Custom Action="INSTALL_TEXT" After="InstallFiles">NOT Installed AND NOT PATCH</Custom>
  <Custom Action="UNINSTALL_TEXT" After="RemoveFiles">Installed AND REMOVE="ALL"</Custom>
</InstallExecuteSequence>

Но я всегда получаю сообщение об ошибке в журнале:

MSI (7C: C0) [14: 03: 01: 026]: Примечание: 1: 1721 2: INSTALL_TEXT 3: C: \ Windows \ Installer \ MSI9938.tmp 4: C: \ test.txt -i
Ошибка 1721. Проблема с этим пакетом установщика Windows. Не удалось запустить программу, необходимую для завершения этой установки. Обратитесь в службу поддержки или к поставщику пакета. Действие: INSTALL_TEXT, расположение: C: \ Windows \ Installer \ MSI9938.tmp, команда: C: \ test.txt -i
MSI (7C: C0) [14: 03: 07: 374]: Продукт: консольное приложение Text Creator - Ошибка 1721. Проблема с этим пакетом установщика Windows. Не удалось запустить программу, необходимую для завершения этой установки. Обратитесь в службу поддержки или к поставщику пакета. Действие: INSTALL_TEXT, расположение: C: \ Windows \ Installer \ MSI9938.tmp, команда: C: \ test.txt -i
Действие завершено 14:03:07: INSTALL_TEXT. Возвращаемое значение 3.

Я включил в приложение MANIFEST для запуска с правами администратора:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Когда я запускаю установщик из командной строки, где консольное приглашение уже запущено с правами администратора, как установка, так и удаление работают нормально! Но когда я запускаю MSI с помощью двойного щелчка, меня просят запустить установку (до продолжения индикатора выполнения), если я хочу запустить с правами администратора. Затем моя установка прерывается с сообщением об ошибке, как указано в журнале выше.

Что приводит к этой проблеме? Я использую WiX 3.5.2519.0 с MSI 2.0 в моем проекте. Моя установка работает на Windows 7 Professional (x64). У меня установлены все фреймворки от 2.0, до 3.0, 3.5 до 4.0!

РЕДАКТИРОВАТЬ: В Windows XP с установленным .NET Framework 2.0 все работает просто отлично!

РЕШЕНИЕ:

<CustomAction Id="QtExecInstallText" Impersonate="no" Return="check" Execute="deferred" BinaryKey="TextCreator.exe" ExeCommand="C:\test.txt -i"/>
<CustomAction Id="QtExecUninstallText" Impersonate="no" Return="check" Execute="deferred" BinaryKey="TextCreator.exe" ExeCommand="C:\test.txt -u"/>
<Binary Id="TextCreator.exe" SourceFile="C:\MyInstaller\Test\Tools\TextCreator.exe"/>
<InstallExecuteSequence>
  <Custom Action="QtExecInstallText" After="InstallFiles">NOT Installed AND NOT PATCH</Custom>
  <Custom Action="QtExecUninstallText" After="RemoveFiles">Installed AND REMOVE="ALL"</Custom>
</InstallExecuteSequence>

=> При связывании пароля -ext "% WIX% \ bin \ WixUtilExtension.dll" с light.exe!

1 Ответ

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

Самый простой способ запустить любой EXE в установщике MSI - использовать Настраиваемое действие при тихом выполнении .

Примеры того, как это реализовать, приведены на связанной странице. FWIW, должным образом запланированное настраиваемое действие (отложенное без олицетворения) уже будет запущено как система, и манифест / UAC повышение не будет применяться. Кроме того, если вы можете реорганизовать ваш .NET EXE, чтобы он представлял собой клиент / сервер (EXE / DLL), вы можете взять класс сервера и использовать его в пользовательском действии Deployment Tools Foundation (DTF).

Это гораздо лучший дизайн, так как он выполняется в процессе, а не вне процесса, и может вызывать MSI API, таких как получение атрибутов CustomActionData, запись в журнал MSI, возврат ErrorSuccess и / или публикацию индикатора выполнения. обновления и сообщения о действиях. По сравнению с этим переход на EXE-файл - это хак.

...