6

Ho un servizio di Windows scritto in C# usando VS2005.Come posso persuadere un VS2005 msi per l'aggiornamento?

L'installazione avviene tramite una procedura guidata che chiama msiexec per installare il file msi creato anche con VS2005.

Ho problemi a generare un file msi che aggiornerà da una versione del servizio a un'altra. Il programma della procedura guidata gestisce il rilevamento della versione correntemente installata, interrompendo il servizio, fornendo una riga di comando appropriata per msiexec e quindi riavviando il servizio.

L'msi esistente ha una versione di versione di 1.1.02, quella nuova è 1.1.03. I codici prodotto e aggiornamento sono identici.

La disinstallazione manuale di 1.1.02 tramite programmi di aggiunta/rimozione funziona correttamente, così come l'installazione di 1.1.03 su un sistema "pulito".

L'aggiornamento da 1.1.02 a 1.1.03 passa attraverso i movimenti ma il risultato finale è 1.1.02 installato.

La riga di comando che utilizza la procedura guidata per l'aggiornamento è:

msiexec/qb/i "MyProduct.msi" REINSTALL = "ALL" REINSTALLMODE = "vos"

Dove sto andando male? Suppongo di aver perso qualcosa di abbastanza fondamentale ...

La posizione di riserva consiste nell'informare i clienti che devono disinstallare manualmente 1.1.02 prima di eseguire la procedura guidata per installare 1.1.03 ma preferirei non devi farlo.

A cura di aggiungere:

Modifica del codice del prodotto (come VS2005 chiede inoltre di) rimuove in realtà la possibilità di aggiornamento a tutti, in quanto il programma di installazione non ti consente di fare una reinstallazione se il codice prodotto hasn è stato precedentemente installato.

Tutto quello che ti consente di fare è installare (e quindi si ottiene il solito "servizio già esistente" -tipo di messaggio).

risposta

8

Ci sono molte cose che devono essere fatte per ottenere "aggiornamenti" per lavorare con MSI se si desidera rimuovere automaticamente la versione precedente.

Prima alcune informazioni di base sui misteriosi "codici". Ci sono 3 codici (GUID) associati ad un MSI:

  1. Codice pacchetto - Questo identifica una particolare versione del programma di installazione MSI e non deve mai essere riutilizzato attraverso costruisce. Deve sempre essere aggiornato.
  2. Codice prodotto - Questo identificatore viene utilizzato per identificare una particolare versione dell'applicazione. Spetta all'autore dell'installatore decidere quando assegnare un nuovo codice prodotto.
  3. Aggiornamento Codice - Questo identifica l'applicazione e non dovrebbe cambiare attraverso la sua vita

Il codice di aggiornamento dovrebbe mai cambiare. Per l'aggiornamento di scenerio, è necessario modificare il codice prodotto per ciascuna versione. Inoltre, come accennato, è necessario eseguire il bump del numero di versione.Il codice prodotto e è possibile trovare il codice di aggiornamento selezionando il progetto di installazione e andando alla finestra Proprietà. Il Codice pacchetto è nascosto in Studio e verrà sempre aggiornato.

L'elemento che probabilmente manca, è inoltre necessario impostare l'impostazione RemovePreviousVersions nella finestra Proprietà su true.

6

Una cosa di più, oltre a mohlsen di risposta (per Visual Studio 2008):

Affinché la vostra uscita primaria (! Vostro EXE) per aggiornare correttamente, è necessario incrementare la versione del file

Questa impostazione può essere trovato nelle Proprietà del progetto: Scheda Applicazione -> Informazioni sull'assemblaggio

+0

Sì, aveva impostato ok. Alla fine ci siamo arresi e abbiamo fatto in modo che la procedura guidata esegua la disinstallazione seguita da una nuova installazione se rileva già una versione precedente. Sembra funzionare bene e consente agli utenti finali di eseguire l'aggiornamento senza dover manualmente manomettere qualcosa. –

+0

Inoltre, per quanto riesco a capire, gli MSI creati da Visual Studio sono apparentemente noti per non permettervi di aggiornare i servizi comunque, quindi, facendo il lavoro nel wizard, ho evitato di cadere nella prossima trappola. –

+0

+1 ma per rendere tutto più chiaro, si sta dicendo di aggiornare la versione del file del progetto MAIN (non il progetto di installazione!). –

2

Un modo più semplice per gestirlo è RIMUOVERE AssemblyFileVersion da tutti gli assembly, inclusi l'eseguibile principale e tutte le DLL gestite.

In ciascuno dei file AssemblyInfo.cs, consiglio di fare qualcosa del genere se non si cura dei numeri di versione, ma si vuole avere una tracciabilità.

[assembly: AssemblyVersion("1.1.*")] 
// don't need this [assembly: AssemblyFileVersion("1.0.0.0")] 

Tutto compila ancora bene, e se non avete l'AssemblyFileVersion definito, quindi il programma di installazione presuppone che tutto è diverso ogni volta (che è probabilmente bene se si sta installando tutte le DLL accanto alla principale EXE).

Ho passato molto tempo a capirlo, soprattutto se non voglio dover incrementare nulla manualmente!

Problemi correlati