2010-01-15 4 views
13

Ho un progetto di installazione VS2008, che crea un setup.msi che installa un'applicazione WinForms (C#).Progetto di installazione VS2008: Disinstallazione del precedente MSI

Ogni volta che aggiorno il numero di versione, gli utenti devono prima disinstallare la versione precedente prima di poter installare quella nuova. Altrimenti viene visualizzato il temuto messaggio "Un'altra versione di questo prodotto è già installato".

Questo è quello che sto facendo già quando costruire una nuova versione del programma di installazione:

  • Set RemovePreviousVersions = true e DetectNewerInstalledVersion = true
  • Incremento AssemblyVersion (del exe che viene distribuito)
  • Incremento Versione (del progetto di installazione)
  • generare una nuova ProductCode (come richiesto da VS, quando la versione è cambiata)
  • Lascia UpgradeCode invariato

Eppure ancora si rifiuta di disinstallare la versione precedente. Allora, cosa ho perso? O cosa sto sbagliando?

Grazie!

+0

Si sta eseguendo direttamente il file Setup.exe o YourApp.msi? – cmw

+0

Mi rendo conto che non offre la massima flessibilità di un .msi, ma la distribuzione ClickOnce è un'opzione? Si aggiornerà automaticamente senza rimozione e consentirà anche agli utenti di tornare alla versione precedente, se necessario (e se lo si consente). Inoltre, hai provato diverse permutazioni di queste opzioni? Che ne dici di non incrementare la AssemblyVersion? – Jay

+0

L'esecuzione di setup.exe o di msi produce lo stesso risultato. Probabilmente non ho provato ogni singola combinazione di queste opzioni, ma ora devo averne provato la maggior parte!Ho sicuramente provato a lasciare AssemblyVersion invariato - Sono abbastanza sicuro che AssemblyVersion non sia (dovrebbe essere) importante qui. –

risposta

19

semi-rispondendo alla mia domanda, solo a beneficio di chiunque sia interessato:

In primo luogo, ho trovato un incredibly useful article su come gli aggiornamenti MSI funzionano.

In secondo luogo, ho trovato InstEd, un editor di MSI freeware piuttosto carino, che mi ha mostrato che non c'era nulla di chiaramente sbagliato nel mio file MSI. (Sì, potrei usare Orca invece, se non mi dispiace scaricare l'intero SDK di Windows per ottenerlo.)

In terzo luogo, e fastidiosamente, il problema originale sembra essersi risolto da solo e non posso riprodurlo Di Più. Se ritorna, e se risolvo di nuovo, aggiungerò un commento qui!

In ogni caso, tutto questo ha sollevato un nuovo - probabilmente peggiore - problema: l'MSI ora ha richiesto per aggiornare l'applicazione ma in realtà non ha installato nulla! La soluzione a questo è il seguente:

  • AssemblyVersion non importa, ma AssemblyFileVersion assolutamente fa: è must incremento, se si desidera che i nuovi file da installare. (Questo è un cambiamento in VS2008, rispetto a VS2005. Veda, ad esempio, this discussion sui gruppi Microsoft .)
  • Tuttavia, AssemblyFileVersion non può autoincrement il modo AssemblyVersion può. Impostandolo su 1.9. * (O su ) verrà visualizzato un errore . La soluzione, da questa volta in Stack Overflow, è impostare AssemblyVersion su autoincrement e quindi aprire AssemblyInfo.cs e rimuovere l'attributo AssemblyFileVersion . Ciò costringerà la versione di file a uguagliare la versione di assembly .
+0

AssemblyVersion vs AssemblyFileVersion mi aiuta molto, soprattutto per non posizionare AssemblyFileVersion nei file AssemblyInfo.cs! Grande aiuto! – psulek

+0

Concordato con il punto finale. Fai tutto secondo la domanda e assicurati di rimuovere AssemblyFileVersion in AssemblyInfo.cs – cmroanirgo

+0

Ho lo stesso problema e trovo che questa soluzione funzioni-ish. Purtroppo perché memorizzo i dati dell'applicazione in Application.LocalUserAppDataPath; Non riesco a cambiare la versione del file altrimenti questo punto in una nuova cartella \ AppData \ Local \ Company \ AppName \ V1.0.0.2 ecc e tutti i miei dati sono in V1.0.0.0. Ciò mi richiederebbe di ricostruire tutti i dati nella nuova cartella ogni volta che l'exe e l'installer sono aggiornati. Eventuali suggerimenti? –

4

Non ho familiarità al 100% con i progetti di installazione di VS 2008 (io uso Advanced Installer me stesso - LO CONSIGLIO VELOCE, hanno persino una versione freeware!), Ma ho già avuto modo di farlo e non è documentato molto chiaramente.

Ci sono 4 parti del numero di versione, come ben sapete, sono sicuro: Major.Minor.Build.Revision. Il REVISION NON è controllato da Windows Installer. Se tutto quello che stai facendo è incrementare la revisione, non funzionerà. Devi incrementare almeno la build del valore ProductVersion.

Spero che questo aiuti!

+0

Sto sempre incrementando almeno la versione secondaria, quindi non penso che sarà così. Grazie per il puntatore a Advanced Installer, anche se ... –

5

per averlo installare rispetto alla versione precedente:

  1. Evidenziare il progetto di installazione.
  2. Premere il tasto F4 per le proprietà. (Clic con il pulsante destro è una casella di proprietà diverse.)
  3. Cambia versione. Dì si al prompt che chiede di cambiare il codice del prodotto.

Ricordare, anche se si ricostruisce la soluzione, non viene ricostruito il progetto di installazione. È necessario ricostruire il progetto di installazione come passaggio separato.

In secondo luogo, non è necessario aumentare ogni volta la versione di assieme. Impostalo su qualcosa come 2.1. * E lo farà automaticamente.

+0

Non sono sicuro che sia solo per me, ma sembra funzionare ogni volta in VS2010. – JBrooks

0

Il servizio di installazione sta prendendo decisioni in base al contenuto della tabella di aggiornamento, quindi è qui che guarderei. La tabella contiene una voce per il codice di aggiornamento, la versione del prodotto della versione attualmente installata rientra nell'intervallo delle versioni specificate per gli aggiornamenti, gli attributi sembrano ok (ad esempio, l'attributo msidbUpgradeAttributesOnlyDetect non è impostato) e così via .

MSDN descrive tutti qui - http://msdn.microsoft.com/en-us/library/aa372379%28VS.85%29.aspx

0

Non dimenticare di incrementare l'AssemblyFileVersion! Se non si specifica la versione del file di assembly, il compilatore presuppone che sia uguale a assemblyVersion. Tuttavia, se assemblyFileVersion è specificato, deve essere incrementato.

0

Sono venuto qui per ottenere aiuto per lo stesso problema. Dopo aver letto il link incredible useful article suppongo che il mio problema fosse che avevo installato la versione precedente con l'opzione "Solo io" e che il nuovo programma di installazione aveva la proprietà InstallAllUsers selezionata (nelle proprietà del progetto di Visual Studio). Quindi, dopo aver disinstallato l'installazione precedente dal pannello di controllo, l'aggiornamento ora funziona. Forse questo aiuta qualcuno.