Если данные в% appdata% \ product \ не могут вызвать проблемы при переустановке приложения, я бы порекомендовал оставить его на месте при удалении. Все, что вы устанавливаете в эту папку, считается пользовательскими данными и не должно автоматически удаляться по умолчанию - и часто также не в качестве опции. Многие компании применяют пользовательские разрешения для папок userprofile. Возникновение там может привести к серьезному взлому MSI - особенно на терминальных серверах, вызвав самовосстановление (что обычно не разрешено на TS).
Помните, что для установки, удаления и установки исправлений используется одна и та же последовательность установки. Если вы используете крупные обновления, которые по существу удаляют и переустанавливают продукт, вы можете удалить пользовательские данные и переустановить их для каждой установки. Если это приемлемо, данные, с которыми вы имеете дело, не являются пользовательскими данными и, следовательно, расположены не в том месте на диске.
Если вы выполняете операцию удаления в конце удаления с помощью пользовательского действия, проверяющего код выхода, вы можете запустить откат удаления, что по существу приведет к переустановке продукта и невозможности его удаления! Редко, но так бывает. Если пользовательское действие запускается после InstallFinalize и, следовательно, выходит за пределы последовательности установки MSI, ваша установка может вернуть код ошибки удаления и оставить ваш продукт неработающим, а удаление неполным или ваш продукт частично незарегистрированным.
Короче, я бы не стал возиться с этим. Если у вас настойчивые клиенты, я бы не стал связываться с диалогом, если бы мог помочь. Я бы добавил свойство PUBLIC, чтобы контролировать, выполняется ли настраиваемое действие непосредственно перед InstallFinalize. Сбросьте все коды возврата ошибок и запишите информацию в журнал MSI. Затем пользователи могут удалить пользовательские данные, указав свойство в командной строке или жестко закодировав его в таблице свойств.
Если вам нужен графический интерфейс, вы можете использовать это же свойство для установки в настраиваемом диалоговом окне, чтобы контролировать, выполняется ли удаление. Не забудьте тщательно обставить отображение диалога. Я не показываю это во время операций исправления.