Как использовать класс VS Installer в Custom Action - PullRequest
0 голосов
/ 17 марта 2011

Десятки записей вопросов и ответов (все, кроме одной в stackoverflow!), Которые я нашел, приблизились к этому вопросу, но не научили меня, что мне нужно. У меня есть то, что должно быть почти простой установкой: служба Windows и соответствующее приложение иконки в трее. Они прекрасно устанавливаются со стандартным проектом VS Setup. После того, как файлы установлены, мне нужно предоставить пользователю диалог для установки некоторых параметров в файле exe.config службы. В этом диалоговом окне пользователь должен иметь возможность прервать установку. Я попробовал два подхода к процессу Custom Action и столкнулся со стеной, когда дело дошло до отката установки.

Подход 1: исполняемый файл для настраиваемого действия, запускаемый во время фиксации. Такого рода работы. Приложение возвращает ненулевой код завершения и происходит откат установки. Что мне не нравится, так это:

  1. Когда приложение закрывается (после того, как пользователь выбирает Отмена), при установке отображается сообщение об ошибке, в котором говорится, что возникла проблема с установкой, и пользователь должен обратиться к поставщику. Поскольку это не так, я бы предпочел более правильное сообщение («Установка отменена пользователем») или вообще никакого сообщения.
  2. Оба вывода проекта (служба и приложение в трее) должны быть перечислены в всех четырех разделах пользовательских действий, иначе мое диалоговое окно не появится. Вместо этого появляется сообщение об отсутствующем файле InstallState, и установка всегда завершается неудачей. Интуитивно кажется, что это неправильно.

Подход 2: Установщик как пользовательское действие, запускается во время установки или фиксации. Для меня это чище (только один элемент, указанный в пользовательских действиях), но откат процесса хуже, чем в подходе 1. Кажется, что я должен вызвать исключение в переопределенном методе (Install / Commit), который затем выдает мне несколько диалогов об ошибках перед откатом, а затем откат не всегда удаляет службу.

Какой самый чистый способ заставить это работать, не переходя на WiX или подобные опции?

Ответы [ 2 ]

0 голосов
/ 18 марта 2011

Простой ответ: не используйте VS Installer Classes. У них есть ряд фундаментальных недостатков дизайна. Я предлагаю вам взглянуть на инструмент развертывания Windows (WiX) Foundation Installer XML (DTF). DTF - это гораздо лучшая библиотека хостинга / взаимодействия для вашего управляемого кода, которая выводит библиотеки DLL, совместимые (с точки зрения MSI) с настраиваемыми действиями C / C ++. Они могут использоваться в качестве пользовательских действий любым инструментом разработки MSI, а не только установщиками WiX.

Фонд средств развертывания присоединяется к набору инструментов WiX.

Управляемые настраиваемые действия с помощью Deployment Tools Foundation (DTF)

0 голосов
/ 18 марта 2011

Я рекомендую этот подход:

  • создайте пользовательский диалог установки, который спрашивает пользователя о ваших параметрах
  • используйте свойства установщика, установленные этим диалогом, чтобы изменить файл конфигурации службы (Вы можете использовать пользовательское действие или поддержку XML другого инструмента разработки программы)

Таким образом, информация собирается перед установкой, и пользователь также может прервать установку без проблем.

Этот подход не поддерживается Visual Studio, но его можно выполнить с помощью бесплатных или коммерческих средств разработки настроек.

Если вы хотите придерживаться настраиваемого действия, вы можете попробовать это:

  • убедитесь, что ваше пользовательское действие откладывается и не запускается во время фиксации (фиксация означает, что установка была выполнена и отката нет)
  • используйте Win32 DLL для отображения вашего пользовательского диалога;таким образом, вы можете вернуть ERROR_INSTALL_USEREXIT (1602) , чтобы вместо диалогового окна с фатальной ошибкой отображался более дружественный диалог выхода пользователя
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...