Десятки записей вопросов и ответов (все, кроме одной в stackoverflow!), Которые я нашел, приблизились к этому вопросу, но не научили меня, что мне нужно. У меня есть то, что должно быть почти простой установкой: служба Windows и соответствующее приложение иконки в трее. Они прекрасно устанавливаются со стандартным проектом VS Setup. После того, как файлы установлены, мне нужно предоставить пользователю диалог для установки некоторых параметров в файле exe.config службы. В этом диалоговом окне пользователь должен иметь возможность прервать установку. Я попробовал два подхода к процессу Custom Action и столкнулся со стеной, когда дело дошло до отката установки.
Подход 1: исполняемый файл для настраиваемого действия, запускаемый во время фиксации.
Такого рода работы. Приложение возвращает ненулевой код завершения и происходит откат установки. Что мне не нравится, так это:
- Когда приложение закрывается (после того, как пользователь выбирает Отмена), при установке отображается сообщение об ошибке, в котором говорится, что возникла проблема с установкой, и пользователь должен обратиться к поставщику. Поскольку это не так, я бы предпочел более правильное сообщение («Установка отменена пользователем») или вообще никакого сообщения.
- Оба вывода проекта (служба и приложение в трее) должны быть перечислены в всех четырех разделах пользовательских действий, иначе мое диалоговое окно не появится. Вместо этого появляется сообщение об отсутствующем файле InstallState, и установка всегда завершается неудачей. Интуитивно кажется, что это неправильно.
Подход 2: Установщик как пользовательское действие, запускается во время установки или фиксации.
Для меня это чище (только один элемент, указанный в пользовательских действиях), но откат процесса хуже, чем в подходе 1. Кажется, что я должен вызвать исключение в переопределенном методе (Install / Commit), который затем выдает мне несколько диалогов об ошибках перед откатом, а затем откат не всегда удаляет службу.
Какой самый чистый способ заставить это работать, не переходя на WiX или подобные опции?