Creare uninstaller

venerdì 09 luglio 2010 - 11.27

margiodo Profilo | Newbie

Ciao a tutti,

il tasto cerca non è mai il mio forte, non riesco mai a trovare qualcosa.. cmq se mi dite che già esiste questa discussione cercherò meglio.

Però la domanda la faccio lo stesso.. in azienda gira un gestionale fatto in vb .net dal mio datore di lavoro, naturalmente è soggetto a revisioni e cambiamenti.. purtroppo ogni qualvolta c'è n aggiornamento devo prima andare in pannello di controllo -> installazione applicazioni e disinstallare la vecchia versione e poi installare la nuova.. vorrei fare una dll update che prima disinstalli in automatico e poi installi la nuova versione.. come posso fare?

Grazie a tutti per le possibili risposte.
Domenico

freeteo Profilo | Guru

Ciao,
devi per forza fare il pacchetto msi?
Perchè se pensi ad una distribuzione ClickOnce (http://msdn.microsoft.com/en-us/library/t71a733d(VS.80).aspx) , non hai problema di gestire l'update (tral'altro lo puoi fare anche da codice...) ti basta distribuire sul server l'ultima release e tutti i client si aggiornano automaticamente.

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

margiodo Profilo | Newbie

putroppo si, ho visto che ho problemi a inserire le dll e restrizioni nelle chiavi di registro. avevo pensato di fare una dll update, che prima eseguiva direttamente con l'installer della vecchia versione l'uninstall ( avevo letto che con /i forzavo l'uninstall o cmq quello penso di poterlo fare) e poi di lanciare in automatico il nuovo setup.. però mi sembra che ci siano troppi giri da fare.. cmq se avete idee, sono sempre ben accette.
>Ciao,
>devi per forza fare il pacchetto msi?
>Perchè se pensi ad una distribuzione ClickOnce (http://msdn.microsoft.com/en-us/library/t71a733d(VS.80).aspx)
>, non hai problema di gestire l'update (tral'altro lo puoi fare
>anche da codice...) ti basta distribuire sul server l'ultima
>release e tutti i client si aggiornano automaticamente.
>
>Ciao.
>
>Matteo Raumer
>[MCAD .net, MVP Visual C#]
>http://blogs.dotnethell.it/freeteo

grazie per la risposta
Domenico

freeteo Profilo | Guru

Ciao,
non so se è applicabile, ma hai a disposizione dei comandi da poter passare all'MSI (http://msdn.microsoft.com/en-us/library/aa372024(VS.85).aspx) quindi magari facendoti un piccolo menù tuo, puoi lanciare prima l'uninstall e poi l'install di quello nuovo...o qualcosa di questo genere

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

margiodo Profilo | Newbie

Si esatto, avevo proprio visto questa pagina e mi era venuta così l'idea di includere il vecchio installer e poi il nuovo

per il momento grazie e se trovo una soluzione migliore la posterò qui.
Domenico

margiodo Profilo | Newbie

Allora ho trovato la soluzione (almeno quella che più mi convince).

Per prima cosa devo dire che non mi piace la soluzione ClickOnce, troppo trasparente al programmatore. Preferisco sempre una via di mezzo.

Veniamo alla mia soluzione. Per primo il più grande problema è che ti vede, con lo stesso progetto di installazione, una versione già installata ma differente. questa la interpreta come una copia non voluta e se vuoi proprio installarla, la devi fare tu coscientemente. Ho provato anche a cambiare il numero di versione dell'installer, ma sembra non apportare le giuste modifiche. bah misteri.. quindi per evitare troppi lavori, semplicemente prima distinstallo e poi installo. E' banale ma sembra funzionare. Attraverso il nome del pacchetto, sono andato a cercare il productCode dell'applicazione installata, una volta ottenuto mi creo da dentro l'applicazione un file batch (stranamente chiamato uninstall.bat). il codice del file batch è stupidissimo.

Per disinstallare la vecchia versione:

"msiexec /uninstall " + strProductCode + " /quiet"

Per installare la nuova versione:

"msiexec /package "+ fileMSI +" /quiet"

Alla fine cancella il file batch.

Il tutto naturalmente poi eseguito da una finestra di comando attraverso il metodo SHELL().

Che ne dite?
Suggerimenti?

Domenico

freeteo Profilo | Guru

>Che ne dite?
>Suggerimenti?
direi che è quello che ti avevo consigliato prima, fare tutto tramite comandi all'installer, quindi non posso che essere d'accordo

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

margiodo Profilo | Newbie

Mi è venuta un'altra idea...

Tra i requisiti di installazione del mio programma, voglio prima installare un altro programma, quello che si occuperà dell'update. E questo sono riuscito a farlo. L'unica cosa devo passare un parametro da un exe all'altro. si può fare? e come?

In pratica dovrebbe essere così:

update.exe versionLabel.text

e leggendo sempre in questo forum si può fare. Nell'applicazione chiamata, come deve essere il codice?

Domenico

freeteo Profilo | Guru

Ciao,
non so se ho capito esattamente quello che devi fare, ma se sei in un installer puoi invocare i metodi del Framework quindi ti basta usare la classe Process:
Process.Start("...path..." , parametri )

o con qualche altra opzione settata sempre di quella classe.
Qualche link utile:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx
http://blogs.dotnethell.it/freeteo/Far-apparire-una-Form-.net-durante-il-deploy-con-Windows-Installer__15332.aspx

Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

margiodo Profilo | Newbie

semplicemente devo passare la versione del programma principale al programma di update. sono totalmente indipendenti. quindi due exe distinti.
Il primo exe quando si carica legge una label dove dà l'informazione della versione installata. a questo punto chiamerà il secondo exe per verificare se è la versione più aggiornata. quindi dovrei fare una cosa del genere: "update.exe versionLabel.Text" e diciamo che dal programma principale il codice saprei farlo. Ora mi chiedo nel progetto Update, qual'è il codice per prendere l'argomento passato?

Thanks
Domenico

freeteo Profilo | Guru

Ciao,
l'argomento passato tramite riga di comando?
Modifica la classe "Program.cs" metodo "Main" che riceva anche i parametri:
static void Main(string[] args) { ... }
e chiaramnte dentro li hai un array di stringhe con i vari comandi che ti vengono passati, è nullo o vuoto se non ti viene passato niente...è questo che cercavi di fare?


Ciao.

Matteo Raumer
[MCAD .net, MVP Visual C#]
http://blogs.dotnethell.it/freeteo

margiodo Profilo | Newbie

ti ringrazio per la risposta.. ma provando e riprovando o semplicemente messo (utilizzo vb .net) il metodo command() che riceve direttamente tutta la stringa dopo il exe richiamato da shell.

Comunque ti ringrazio sempre per il tuo aiuto.
Domenico
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5