Podczas odinstalowywania mojej aplikacji chciałbym skonfigurować instalację Wix , aby usunąć wszystkie pliki, które zostały dodane po pierwotnej instalacji . Wygląda na to, że deinstalator usuwa tylko katalogi i pliki, które zostały pierwotnie zainstalowane z pliku MSI i pozostawia wszystko inne, co zostało dodane później w folderze aplikacji. Innymi słowy, chciałbym wyczyścić katalog podczas odinstalowywania. Jak mogę to zrobić?
źródło
</Component>
niepowodzeniu kompilacjiFound orphaned Component 'MyAppFolder'.
Użyj
RemoveFolderEx
elementu z rozszerzenia Util w WiX.Przy takim podejściu wszystkie podkatalogi są również usuwane (w przeciwieństwie do bezpośredniego używania
RemoveFile
elementu ). Ten element dodaje tymczasowe wierszeRemoveFile
iRemoveFolder
tabelę w bazie danych MSI.źródło
RemoveFile
iRemoveFolder
. Jeśli chcesz zachować pliki po uaktualnieniu, nie możesz użyć wszystkich tych podejść.Aby to zrobić, po prostu utworzyłem niestandardową akcję, która będzie wywoływana podczas odinstalowywania.
Kod WiX będzie wyglądał następująco:
<Binary Id="InstallUtil" src="InstallUtilLib.dll" /> <CustomAction Id="DIRCA_TARGETDIR" Return="check" Execute="firstSequence" Property="TARGETDIR" Value="[ProgramFilesFolder][Manufacturer]\[ProductName]" /> <CustomAction Id="Uninstall" BinaryKey="InstallUtil" DllEntry="ManagedInstall" Execute="deferred" /> <CustomAction Id="UninstallSetProp" Property="Uninstall" Value="/installtype=notransaction /action=uninstall /LogFile= /targetDir="[TARGETDIR]\Bin" "[#InstallerCustomActionsDLL]" "[#InstallerCustomActionsDLLCONFIG]"" /> <Directory Id="BinFolder" Name="Bin" > <Component Id="InstallerCustomActions" Guid="*"> <File Id="InstallerCustomActionsDLL" Name="SetupCA.dll" LongName="InstallerCustomActions.dll" src="InstallerCustomActions.dll" Vital="yes" KeyPath="yes" DiskId="1" Compressed="no" /> <File Id="InstallerCustomActionsDLLCONFIG" Name="SetupCA.con" LongName="InstallerCustomActions.dll.Config" src="InstallerCustomActions.dll.Config" Vital="yes" DiskId="1" /> </Component> </Directory> <Feature Id="Complete" Level="1" ConfigurableDirectory="TARGETDIR"> <ComponentRef Id="InstallerCustomActions" /> </Feature> <InstallExecuteSequence> <Custom Action="UninstallSetProp" After="MsiUnpublishAssemblies">$InstallerCustomActions=2</Custom> <Custom Action="Uninstall" After="UninstallSetProp">$InstallerCustomActions=2</Custom> </InstallExecuteSequence>
Kod metody OnBeforeUninstall w InstallerCustomActions.DLL będzie wyglądał następująco (w języku VB).
Protected Overrides Sub OnBeforeUninstall(ByVal savedState As System.Collections.IDictionary) MyBase.OnBeforeUninstall(savedState) Try Dim CommonAppData As String = Me.Context.Parameters("CommonAppData") If CommonAppData.StartsWith("\") And Not CommonAppData.StartsWith("\\") Then CommonAppData = "\" + CommonAppData End If Dim targetDir As String = Me.Context.Parameters("targetDir") If targetDir.StartsWith("\") And Not targetDir.StartsWith("\\") Then targetDir = "\" + targetDir End If DeleteFile("<filename.extension>", targetDir) 'delete from bin directory DeleteDirectory("*.*", "<DirectoryName>") 'delete any extra directories created by program Catch End Try End Sub Private Sub DeleteFile(ByVal searchPattern As String, ByVal deleteDir As String) Try For Each fileName As String In Directory.GetFiles(deleteDir, searchPattern) File.Delete(fileName) Next Catch End Try End Sub Private Sub DeleteDirectory(ByVal searchPattern As String, ByVal deleteDir As String) Try For Each dirName As String In Directory.GetDirectories(deleteDir, searchPattern) Directory.Delete(dirName) Next Catch End Try End Sub
źródło
Oto wariacja na temat sugestii @ tronda. Usuwam plik „install.log”, który jest tworzony przez inną akcję niestandardową podczas odinstalowywania:
<Product> <CustomAction Id="Cleanup_logfile" Directory="INSTALLFOLDER" ExeCommand="cmd /C "del install.log"" Execute="deferred" Return="ignore" HideTarget="no" Impersonate="no" /> <InstallExecuteSequence> <Custom Action="Cleanup_logfile" Before="RemoveFiles" > REMOVE="ALL" </Custom> </InstallExecuteSequence> </Product>
O ile rozumiem, nie mogę użyć opcji „RemoveFile”, ponieważ ten plik jest tworzony po instalacji i nie jest częścią grupy komponentów.
źródło
To byłaby pełniejsza odpowiedź na sugestię @Pavel , dla mnie działa w 100%:
<Fragment Id="FolderUninstall"> <?define RegDir="SYSTEM\ControlSet001\services\[Manufacturer]:[ProductName]"?> <?define RegValueName="InstallDir"?> <Property Id="INSTALLFOLDER"> <RegistrySearch Root="HKLM" Key="$(var.RegDir)" Type="raw" Id="APPLICATIONFOLDER_REGSEARCH" Name="$(var.RegValueName)" /> </Property> <DirectoryRef Id='INSTALLFOLDER'> <Component Id="UninstallFolder" Guid="*"> <CreateFolder Directory="INSTALLFOLDER"/> <util:RemoveFolderEx Property="INSTALLFOLDER" On="uninstall"/> <RemoveFolder Id="INSTALLFOLDER" On="uninstall"/> <RegistryValue Root="HKLM" Key="$(var.RegDir)" Name="$(var.RegValueName)" Type="string" Value="[INSTALLFOLDER]" KeyPath="yes"/> </Component> </DirectoryRef> </Fragment>
A pod elementem Produkt:
<Feature Id="Uninstall"> <ComponentRef Id="UninstallFolder" Primary="yes"/> </Feature>
Ta metoda ustawia wartość rejestru z żądaną ścieżką folderu, który ma zostać usunięty podczas odinstalowywania. Na koniec zarówno INSTALLFOLDER, jak i folder rejestru są usuwane z systemu. Zauważ, że ścieżka do rejestru może znajdować się w innej gałęzi i innych lokalizacjach.
źródło
Nie jesteś ekspertem WIX, ale czy możliwym (prostszym?) Rozwiązaniem tego problemu może być uruchomienie niestandardowej akcji cichej realizacji, która jest częścią wbudowanych rozszerzeń WIX?
Można uruchomić polecenie rmdir MS DOS z opcjami / S i / Q.
<Binary Id="CommandPrompt" SourceFile="C:\Windows\System32\cmd.exe" />
Niestandardowe działanie wykonujące zadanie jest proste:
<CustomAction Id="DeleteFolder" BinaryKey="CommandPrompt" ExeCommand='/c rmdir /S /Q "[CommonAppDataFolder]MyAppFolder\PurgeAppFolder"' Execute="immediate" Return="check" />
Następnie będziesz musiał zmodyfikować InstallExecuteSequence zgodnie z dokumentacją w wielu miejscach.
Aktualizacja: Wystąpiły problemy z tym podejściem. Skończyło się na utworzeniu niestandardowego zadania, ale nadal uważa to za wykonalne rozwiązanie, ale bez uzyskania szczegółów.
źródło
cmd.exe
w swoim instalatorze. 2) Wprowadzasz zmiany w systemie podczas generowania skryptu 3) Nie ma opcji wycofywania 4) Nie radzi sobie poprawnie z zablokowanymi plikami