L'elemento Upgrade all'interno dell'elemento Product, combinato con la corretta pianificazione dell'azione, eseguirà la disinstallazione che stai cercando. Assicurati di elencare i codici di aggiornamento di tutti i prodotti che desideri rimuovere.
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" />
<Upgrade Id="00000000-0000-0000-0000-000000000000">
<UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" />
</Upgrade>
Nota che, se stai attento con le tue build, puoi impedire alle persone di installare accidentalmente una versione precedente del tuo prodotto su una più nuova. Ecco a cosa serve il campo Massimo. Quando realizziamo i programmi di installazione, impostiamo UpgradeVersion Maximum sulla versione in fase di creazione, ma IncludeMaximum = "no" per impedire questo scenario.
Sono disponibili opzioni relative alla pianificazione di RemoveExistingProducts. Preferisco programmarlo dopo InstallFinalize (piuttosto che dopo InstallInitialize come altri hanno raccomandato):
<InstallExecuteSequence>
<RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts>
</InstallExecuteSequence>
Ciò lascia installata la versione precedente del prodotto fino a quando non vengono copiati i nuovi file e le chiavi di registro. Questo mi consente di migrare i dati dalla vecchia versione alla nuova (ad esempio, hai cambiato l'archiviazione delle preferenze dell'utente dal registro in un file XML, ma vuoi essere educato e migrare le loro impostazioni). Questa migrazione viene eseguita in un'azione personalizzata posticipata appena prima di InstallFinalize.
Un altro vantaggio è l'efficienza: se ci sono file invariati, Windows Installer non si preoccupa di copiarli di nuovo quando si pianifica dopo InstallFinalize. Se si pianifica dopo InstallInitialize, la versione precedente viene completamente rimossa per prima, quindi viene installata la nuova versione. Ciò comporta la cancellazione e la ricopiatura inutili dei file.
Per altre opzioni di pianificazione, consultare l'argomento della guida di RemoveExistingProducts in MSDN. Questa settimana, il link è: http://msdn.microsoft.com/en-us/library/aa371197.aspx