Здравствуйте, yeti, Вы писали:
Y>При удалении приложения нужен чекбокс "удалить настройки" (файлы, изначально инсталлятором не ставятся).
Y>Насколько я понял, CustomAction, удаляющее файл вызовом del, несовместимо с откатом удаления, а <RemoveFile /> etc жёстко привязан к компоненту, и завязать его на чекбокс при удалении нельзя?
Y>Так как сделать правильно?
Завести три CustomAction: PrepareDeleteSettingsCA — обычного типа, DeleteSettingsCA — deferred, RollbackDeleteSettingsCA -rollback.
Добавить PrepareDeleteSettingsCA в InstallExecuteSequence с условием, что вызывается оно при удалении.
<Custom Action="PrepareDeleteSettingsCA" Before="RemoveFiles"><![CDATA[$(var.Uninstall)]]></Custom>
Идти оно должно до RemoveFiles, так как последнее сначала удаляет файлы, поставленные инсталлятором, а потом удаляет папки, созданные инсталлятором.
Но папки будут удалены только в том случае, если в них не останется никаких файлов. Значит, твои файлы настроек должны быть уже удалены к этому времени.
в следующем порядке: PrepareDeleteSettingsCA, RollbackDeleteSettingsCA, DeleteSettingsCA
( В принципе, добавить можно только PrepareDeleteSettingsCA, а два других вызвать из него же. Но rollback должно идти раньше ).
PrepareDeleteSettingsCA прикапывает во временную папку TempBackupFolder файлы настроек.
После этого вызывает RollbackDeleteSettingsCA и DeleteSettingsCA ( именно в таком порядке !!! ). В RollbackDeleteSettingsCA надо передать TempBackupFolder черезCA_DATA.
DeleteSettingsCA удаляет файлы настроек.
RollbackDeleteSettingsCA — восстанавливает их из TempBackupFolder. При этом саму TempBackupFolder удаляет.
Все!!!
Для успокоения совести можно еще в конце удалить папку TempBackupFolder.