Domanda

Durante la disinstallazione della mia applicazione, vorrei configurare l'impostazione Wix per rimuovere tutte le file che sono stati aggiunti dopo l'installazione originale . Sembra che il programma di disinstallazione rimuova solo le directory e i file che sono stati originariamente installati dal file MSI e lascia tutto il resto aggiunto successivamente nella cartella dell'applicazione. In altre parole, desidero eliminare la directory durante la disinstallazione. Come posso farlo?

È stato utile?

Soluzione

Usa Rimuovi elemento file con On = " disinstallazione " ;. Ecco un esempio:

<Directory Id="CommonAppDataFolder" Name="CommonAppDataFolder">
  <Directory Id="MyAppFolder" Name="My">
    <Component Id="MyAppFolder" Guid="*">
      <CreateFolder />
      <RemoveFile Id="PurgeAppFolder" Name="*.*" On="uninstall" />
    </Component>
  </Directory>
</Directory>

Aggiorna

  

Non ha funzionato al 100%. Ha rimosso i file, tuttavia nessuna delle directory aggiuntive -   quelli creati dopo l'installazione - sono stati rimossi. Qualche idea su questo? & # 8211; pribeiro

Sfortunatamente Windows Installer non supporta l'eliminazione delle directory con le sottodirectory. In questo caso devi ricorrere ad azioni personalizzate. Oppure, se sai cosa sono le sottocartelle, crea un gruppo di elementi RemoveFolder e RemoveFile.

Altri suggerimenti

Per fare ciò, ho semplicemente creato un'azione personalizzata da chiamare al momento della disinstallazione.

Il codice WiX sarà simile al seguente:

<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=&quot;[TARGETDIR]\Bin&quot; &quot;[#InstallerCustomActionsDLL]&quot; &quot;[#InstallerCustomActionsDLLCONFIG]&quot;" />

<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>

Il codice per il metodo OnBeforeUninstall in InstallerCustomActions.DLL sarà simile a questo (in 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

Ecco una variazione sul suggerimento di @ tronda. Sto eliminando un file " install.log " che viene creato da un'altra azione personalizzata, durante la disinstallazione:

<Product>
    <CustomAction Id="Cleanup_logfile" Directory="INSTALLFOLDER"
    ExeCommand="cmd /C &quot;del install.log&quot;"
    Execute="deferred" Return="ignore" HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
      <Custom Action="Cleanup_logfile" Before="RemoveFiles" >
        REMOVE="ALL"
      </Custom>
    </InstallExecuteSequence>
</Product>

Per quanto ho capito, non posso usare " RemoveFile " perché questo file viene creato dopo l'installazione e non fa parte di un gruppo di componenti.

Non un esperto WIX, ma potrebbe essere una soluzione (più semplice?) possibile eseguire Azione personalizzata esecuzione silenziosa che fa parte delle estensioni integrate di WIX?

Potrebbe eseguire il rmdir comando MS DOS con le opzioni / S e / Q.

<Binary Id="CommandPrompt" SourceFile="C:\Windows\System32\cmd.exe" />

E l'azione personalizzata che fa il lavoro è semplice:

<CustomAction Id="DeleteFolder" BinaryKey="CommandPrompt" 
              ExeCommand='/c rmdir /S /Q "[CommonAppDataFolder]MyAppFolder\PurgeAppFolder"' 
              Execute="immediate" Return="check" />

Quindi dovrai modificare InstallExecuteSequence come documentato in molti luoghi.

Aggiornamento: Ha avuto problemi con questo approccio. Finì invece per creare un'attività personalizzata, ma la considera comunque una soluzione praticabile, ma senza far funzionare i dettagli.

Questa sarebbe una risposta più completa per il suggerimento @Pavel , per me funziona al 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>

E, in Elemento prodotto:

<Feature Id="Uninstall">
    <ComponentRef Id="UninstallFolder" Primary="yes"/>
</Feature>

Questo approccio imposta un valore di registro con il percorso desiderato della cartella da eliminare durante la disinstallazione. Alla fine, sia INSTALLFOLDER che la cartella del registro vengono rimossi dal sistema. Si noti che il percorso per il registro può trovarsi in altri alveari e in altre posizioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top