2010-10-25 13 views
7

Quindi, ho questa applicazione per la quale stiamo producendo ulteriori versioni di sviluppo.Differenziare tra la disinstallazione/installazione e l'aggiornamento di un'applicazione

Se l'applicazione viene disinstallata dall'utente (da Aggiungi/Rimuovi programmi diciamo), quindi voglio che l'applicazione elimini una determinata cartella nel file system che contiene informazioni relative alle app.

Tuttavia, se l'applicazione viene aggiornata (scaricando un programma di installazione più recente per questa applicazione e installandolo), quindi voglio che mantenga quella cartella.

Sono sotto l'impressione (al momento) che non è possibile distinguere tra la disinstallazione/installazione e l'aggiornamento di un'applicazione da una versione all'altra, perché i progetti di distribuzione .NET trattano l'aggiornamento come solo un'altra disinstallazione/installazione procedura, ma ciò dovrebbe essere possibile in qualche modo.

Grazie per il tempo e le risposte che posso ottenere.

risposta

0

Ho finalmente anche trovato un modo per verificare se l'applicazione è l'aggiornamento o se si tratta di una nuova installazione:

  • L'applicazione lascia un po 'di informazioni su se stesso nel Registro di sistema (nome dell'applicazione, il numero di versione eccetera.). Questo è di solito memorizzato all'interno

LocalMachine \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall \ {Application GUID}

Quando l'applicazione viene disinstallata che l'informazione viene rimosso.

  • Ma è possibile verificare tali informazioni quando si installa una versione dell'applicazione (ciò può essere fatto aggiungendo alcune azioni personalizzate nel progetto di distribuzione). Posso controllare sotto la beforeInstall metodo e guardo nel Registro di sistema per il valore DisplayVersion, in questo modo:


RegistryKey regKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{AppGUIDHere}"); 
string version = (string)regKey.GetValue("DisplayVersion"); 

  • Questo valore conterrà la versione attualmente installata sul computer. Se questa versione installata è più piccola della versione dell'applicazione che stai tentando di installare, segui il percorso logico di UPGRADING

  • Se non riesci a trovare nulla nel registro sotto quella chiave, significa che questo è una nuova installazione (non ci sono altre applicazioni prima di questa installata sul computer). E qui segui l'altro percorso logico della semplice installazione di

Spero che questo aiuti qualcuno.

+0

Fuori interesse, è DisplayVersion il valore dell'impostazione ProductVersion nel pacchetto di installazione? – Rikalous

+0

Non penso che sia dove l'applicazione ottiene la DisplayVersion (perché non ha lo stesso formato, cioè DisplayVersion ha 4 punti che separano le versioni major/secondarie ecc.). Penso che lo prenda da alcuni file AssemblyInfo.cs all'interno del progetto. – Andrei

0

Hai provato a utilizzare la distribuzione di ClickOnce? Gestisce tutte le installazioni e gli aggiornamenti dell'applicazione. Modificando lo stato di pubblicazione dei file inclusi nell'aggiornamento è possibile controllare se il file viene sovrascritto con un aggiornamento o rimane invariato. Quando l'applicazione viene disinstallata, tutti i file verranno rimossi.

1

Questa non è una risposta diretta, ma avete considerato l'utilizzo di software di installazione di terze parti? Usiamo InnoSetup per la distribuzione di un'applicazione .Net, e lo troviamo abbastanza facile da usare e molto flessibile. Potrebbe certamente gestire ciò che stai descrivendo.

+0

Questo non è quello che è stato chiesto ma, IMHO, sicuramente una buona risposta, avendo appena dovuto passare attraverso un altro aggiornamento dell'installer MSI (e successivo riavvio del server!) Per qualche installazione di software stupido. Sono così felice che usiamo InnoSetup per distribuire (e aggiornare) il nostro software. – shunty

0

L'utilizzo di un programma di installazione di wix consente di effettuare questa differenziazione. Questo è un approccio più pratico, ma funzionerà.

0

Si potrebbe anche provare ad aggiungere qualche azione di preinstallazione personalizzata, che copia la cartella menzionata in una cartella temporanea e quindi un'azione di post-installazione lo copia al suo posto. Ma, per prima cosa, considera prima le suddette domande, come l'uso di un programma di installazione più potente o di ClickOnce.

2

Il programma di installazione dispone di tre codici GUID, ProductCode, PackageCode e UpgradeCode che è possibile utilizzare per gestire questi scenari: UpgradeCode è come un ID applicazione e non deve essere modificato tra le versioni; il PackageCode identifica una versione della tua configurazione e ProductCode identifica una versione del tuo software. È possibile modificare il ProductCode incrementando il valore ProductVersion.

Windows utilizza ProductCode per verificare se l'applicazione è già installata su un sistema. Se si reinstalla utilizzando un programma di installazione con lo stesso ProductCode e PackageCode, si ottiene un'opzione di riparazione/disinstallazione.

+0

Grazie Rik, ma come posso ottenere ProductCode o PackageCode o ecc. Di una versione precedente? – Andrei

+0

C'è uno strumento chiamato Orca, che fa parte di Windows SDK (credo), che è un editor msi di basso livello. Dovresti essere in grado di ispezionare un precedente pacchetto MSI per ottenere i dettagli. – Rikalous

+0

Come utilizzerei queste informazioni nel codice che intendo? – Andrei

Problemi correlati