У меня есть элемент util: RemoveFolderEx, который я хочу запускать только при удалении программы.Я помещаю его в его собственный компонент, а затем устанавливаю условие для свойства относительно того, должно ли оно быть включено.
Может кто-нибудь объяснить мне, почему следующее не работает?
<Property Id='UNINSTALLMODE' Value="FALSE"></Property>
<DirectoryRef Id="DATADIR">
<Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
<util:RemoveFolderEx On="uninstall" Property="DATADIR" ></util:RemoveFolderEx>
<Condition>(UNINSTALLMODE="TRUE")</Condition>
</Component>
</DirectoryRef>
<CustomAction Id="CA.SetUninstallMode" Property="UNINSTALLMODE" Value="TRUE" />
<InstallExecuteSequence>
<Custom Action="CA.SetUninstallMode" Before="WixRemoveFoldersEx" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>
Я проверил журналы, и настраиваемое действие правильно устанавливает UNINSTALLMODE в «TRUE» при удалении программного обеспечения.При установке и переустановке это «ЛОЖЬ».Я пробовал настраиваемое действие, которое должно быть запланировано до = "WixRemoveFoldersEx" и до = "CostInitialise", которые имеют отношение к RemoveFoldersEx.
Любая помощь очень ценится, это сводит меня с ума!Neil
РЕДАКТИРОВАТЬ: я обновил wix для этого
<Property Id='P.INSTALLMODE' Value='0'></Property>
<Property Id='P.UNINSTALLMODE' Value='0'></Property>
<DirectoryRef Id="DATADIR">
<Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
<util:RemoveFolderEx On="uninstall" Property="DATADIR" ></util:RemoveFolderEx>
<Condition>(P.INSTALLMODE = 1) OR (P.UNINSTALLMODE = 1)</Condition>
</Component>
</DirectoryRef>
<CustomAction Id="CA.SetInstallModeToTrue" Property="P.INSTALLMODE" Value='1' />
<CustomAction Id="CA.SetUninstallModeToTrue" Property="P.UNINSTALLMODE" Value='1' />
<InstallExecuteSequence>
<RemoveExistingProducts Before="InstallInitialize" />
<Custom Action="CA.SetInstallModeToTrue" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (NOT PREVIOUSVERSIONSINSTALLED)</Custom>
<Custom Action="CA.SetUninstallModeToTrue" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>
Пользовательские действия запускаются сразу после считывания значения DATADIR из реестра и до CostInitialize.
Вот что происходит в следующих ситуациях
- Установить -> условие выполнено и компонент установлен
- Переустановить -> условие не выполнено, но компонентвсе еще деинсталлируется, а затем переустанавливается
- Деинсталляция -> условие выполнено и компонент деинсталлирован
Все, что я могу из этого сделать, это то, что условие применимо только для процедуры установки и один разкомпонент установлен, невозможно наложить на него условие для удаления.
EDIT2: наконец-то все заработало, используя свойство для removefolderex, которое устанавливается пользовательским действием.Кажется, теперь просто.
<Property Id='P.REMOVEDATAFOLDER' Secure='yes' />
<DirectoryRef Id="DATADIR">
<Component Id="C.RemoveDataFolder" Guid="myguid" KeyPath="yes">
<util:RemoveFolderEx On="uninstall" Property="P.REMOVEDATAFOLDER" />
</Component>
</DirectoryRef>
<CustomAction Id="CA.SetDataFolder" Property="P.REMOVEDATAFOLDER" Value='[DATADIR]' />
<InstallExecuteSequence>
<Custom Action="CA.SetDataFolder" Before="ValidateProductID" >(NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")</Custom>
</InstallExecuteSequence>