2011-09-23 8 views
19

Ho visto altre domande su questo argomento, ma non riesco a farlo funzionare per me. Sto cercando di abituarmi a Wix in modo che possiamo migrare i nostri vdproj (mi sembra di aver fatto un passo in avanti e 4 passi indietro ... le cose più semplici sono diventate completamente non banali con Wix ... ma vedo il valore di avere un markup dichiarativo completo per gli installatori di edifici).Wix Not Removing Files on Uninstall

Ho i seguenti wx in un wixproj in SharpDevelop.

Installazione opere. La disinstallazione non fa nulla e lascia la cartella di installazione e la DLL installate. Qual è il problema?

Files.wxs:

<?xml version="1.0"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Fragment> 
     <DirectoryRef Id="TARGETDIR"> 
      <Directory Id="ProgramFilesFolder" Name="PFiles"> 
       <Directory Id="INSTALLDIR" Name="Client"> 
        <Component Id="InteropDll" Guid="AD09F8B9-80A0-46E6-9E36-9618E2023D66" DiskId="1"> 
         <File Id="Interop.dll" Name="Interop.dll" Source="..\Interop\bin\$(var.Configuration)\Interop.dll" KeyPath="yes" /> 
         <RemoveFile Id="RemoveInterop.dll" Name="Interop.dll" On="uninstall" /> 
        </Component> 
       </Directory> 
      </Directory> 
     </DirectoryRef> 
    </Fragment> 
</Wix> 

Setup.wxs:

<?xml version="1.0"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="*" 
     Name="Client Setup" 
     Language="1033" 
     Version="1.0.0.0" 
     UpgradeCode="4A88A3AD-7CB6-46FB-B2FD-F4EADE0218F8" 
     Manufacturer="Client Setup"> 
     <Package Description="#Description" 
      Comments="Comments" 
      InstallerVersion="200" 
      Compressed="yes"/> 
     <!-- 
      Source media for the installation. 
      Specifies a single cab file to be embedded in the installer's .msi. 
     --> 
     <Media Id="1" Cabinet="contents.cab" EmbedCab="yes" CompressionLevel="high"/> 

     <!-- Installation directory and files are defined in Files.wxs --> 
     <Directory Id="TARGETDIR" Name="SourceDir"/> 

     <Feature Id="Complete" 
       Title="Client Setup" 
       Description="Client Setup" 
       Level="1"> 
      <ComponentRef Id="InteropDll" /> 
     </Feature> 

     <!-- 
      Using the Wix UI library 

      WixUI_InstallDir does not allow the user to choose 
      features but adds a dialog to let the user choose a 
      directory where the product will be installed 
     --> 
     <Property Id="WIXUI_INSTALLDIR">INSTALLDIR</Property> 

     <UI Id="WixUI_InstallDir"> 
      <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" /> 
      <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" /> 
      <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" /> 

      <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" /> 
      <Property Id="WixUI_Mode" Value="InstallDir" /> 

      <DialogRef Id="BrowseDlg" /> 
      <DialogRef Id="DiskCostDlg" /> 
      <DialogRef Id="ErrorDlg" /> 
      <DialogRef Id="FatalError" /> 
      <DialogRef Id="FilesInUse" /> 
      <DialogRef Id="MsiRMFilesInUse" /> 
      <DialogRef Id="PrepareDlg" /> 
      <DialogRef Id="ProgressDlg" /> 
      <DialogRef Id="ResumeDlg" /> 
      <DialogRef Id="UserExit" /> 

      <Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3">1</Publish> 
      <Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish> 

      <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish> 

      <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">NOT Installed</Publish> 
      <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish> 

      <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish> 
      <Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish> 
      <Publish Dialog="InstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish> 
      <Publish Dialog="InstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish> 
      <Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish> 
      <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish> 
      <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish> 

      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg" Order="1">NOT Installed</Publish> 
      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish> 
      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">Installed AND PATCH</Publish> 

      <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish> 

      <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish> 
      <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish> 
      <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish> 

      <Property Id="ARPNOMODIFY" Value="1" /> 
     </UI> 

     <UIRef Id="WixUI_Common" /> 
    </Product> 
</Wix> 
+0

La configurazione sembra ok. Hai provato a creare un log di disinstallazione dettagliato per vedere cosa succede? http://setupanddeployment.com/debugging/msi-log. Cerca le azioni InstallValidate e RemoveFiles e guarda cosa fanno. –

+0

Non so come, ma sembra che abbia iniziato a lavorare in modo casuale ... – Jeff

risposta

35

tenta di modificare il GUID dei componenti che non sono disinstallazione. Ho provato lo stesso e ha funzionato per me. Può essere perché il GUID è già registrato nel registro da qualche altro prodotto.

+1

sì, è così. Ho impostato il comando su * e questo ha funzionato ... – Jeff

+0

Tu sei l'uomo. Ho lottato con questo problema per poche ore. Il GUID su quel componente specifico era vuoto. Ho aggiunto un GUID e ha funzionato. – gangt

+2

Devi generare una nuova guida ogni volta che crei una build separata per assicurarti che la disinstallazione funzioni – TheWommies

5

In qualche modo ho ottenuto il mio progetto nello stato in cui non era possibile disinstallare ogni singolo componente. Non ho idea di come. Ho scritto un programma che prenderà un file .wixproj e cambierà tutti i GUID del componente in nuovi GUID e che ha risolto il problema (dopo che ho cancellato manualmente i file). Questo si basa sulla risposta dell'utente593287.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Xml; 

namespace GuidFixer 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      string projectFileName = args[0]; 
      string path = Path.GetDirectoryName(projectFileName); 
      List<string> files = new List<string>(); 

      XmlDocument projectDocument = new XmlDocument();    
      projectDocument.Load(projectFileName); 
      XmlNamespaceManager manager = new XmlNamespaceManager(projectDocument.NameTable); 
      manager.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003"); 

      // Finds all of the files included in the project. 
      XmlNodeList nodes = projectDocument.SelectNodes("/msbld:Project/msbld:ItemGroup/msbld:Compile", manager); 
      foreach (XmlNode node in nodes) 
      { 
       string fileName = Path.Combine(path, node.Attributes["Include"].Value); 
       files.Add(fileName); 
      } 

      foreach (string fileName in files) 
      { 
       // Lets only do .wxs files 
       if (!Path.GetExtension(fileName).Equals(".wxs", StringComparison.CurrentCulture)) 
       { 
        continue; 
       } 

       // This will only update files that aren't readonly, make sure 
       // you check out your files from source control before running. 
       FileAttributes attributes = File.GetAttributes(fileName); 
       if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
       { 
        continue; 
       } 

       bool modified = false; 

       XmlDocument doc = new XmlDocument(); 
       doc.PreserveWhitespace = true; // space inside tags are still lost 
       doc.Load(fileName); 

       foreach (XmlNode node in doc.GetElementsByTagName("Component")) 
       { 
        Guid guid = Guid.NewGuid(); 
        string value = guid.ToString("B").ToUpper(); 

        node.Attributes["Guid"].Value = value; 
        modified = true; 
       } 

       // Only update files that were modified, to preserve formatting. 
       if (modified) 
       { 
        doc.Save(fileName); 
       } 
      } 
     }   
    } 
} 

Ho apportato alcune modifiche ad esso senza verificarlo, quindi buona fortuna, è piuttosto semplice però.

+0

Utile. Noterò per i futuri utenti che, sebbene non gestisca * .wxs come un file arg, funziona se si specifica esplicitamente il nome del file. (usando * .wxs risultante in un 'carattere illegale nel percorso' Eccezione System.IO.Path.) –

1

Ho riscontrato un problema simile, che sembra non essere più presente quando ho convertito tutti i guids in maiuscolo (come richiesto in alcune specifiche per problemi di compatibilità). Non ho testato in modo approfondito se questa fosse davvero la soluzione al problema. Forse è lo stesso della risposta precedente.

1

Vale la pena controllare la seguente chiave di registro per verificare se i file sono elencati. Ciò può far sì che il programma di disinstallazione ignori i componenti poiché ritiene che siano condivisi.

HKLM\Software\Microsoft\Windows\CurrentVersion\SharedDlls 
6

Assicurarsi che nessun altro pacchetto MSI stia mantenendo i componenti installati.

In particolare, accedere a Pannello di controllo/Programmi e funzionalità e assicurarsi che non sia ancora installata una versione "vecchia" del programma.