Freeteo


Pensieri e C#dice di Matteo Raumer

Far apparire una Form .net durante il deploy con Windows Installer

Solitamente quando devo fare il deploy di un'applicazione WindowsForm uso ClickOnce (che adoro), o al massimo mi accontento del progetto di setup di Windows Installer senza bisogno di ulteriori configurazioni durante il Wizard, quindi diciamo che mi arrangio con quello che c'è in Visual Studio.

Ma qualche giorno fa, nel Wizard di installazione mi è stato richiesto di poter impostare qualche parametro relativo al programma come la scelta del Database, un path dove archiviare dei documenti etc...ossia qualcosa che richiedesse l'interazione utente in una Form di Windows, dietro alla quale potessi scrivere il codice .net che mi serviva.

Dopo aver fatto le classiche operazioni per creare il pacchetto di setup della mia applicazione,(creare un progetto Setup, dirgli qual'è il suo "Primary Output" etc..) sono partito cercando di capire cosa potessi personalizzare delle varie maschere del wizard nello "User Interface Editor". Putroppo però, mi sono scontrato con parecchie limitazioni...capibile dato che il pacchetto è gratuitamente incluso in Visual Studio.
 
Allora ho cambiato strada, cercando di far apparire dentro ad una maschera di queste, un mio UserControl dietro al quale potessi scrivere tutto il codice .net che volevo...ma anche qui niente da fare.

 
Ho optato quindi per inserire una Form classica in .net richiamata dal programma di setup, per poter mettere dentro li tutto quello che mi serviva, il che è facilmente fattibile aggiungendo al progetto un Installer:
 
 
 
Dopodichè dico al pacchetto d'installazione di usare l'installer mio:
 


A questo punto mi basta solo andare in override del metodo "OnAfterInstall" per lanciare, tramite "ShowDialog()" la mia Form .net alla fine dell'installazione (quindi dopo che tutto il pacchetto era stato installato e i file erano stati copiati nella directory scelta dall'utente):
 
 
A quel punto il gioco è fatto, perchè nel "Close" della maschera ovviamente viene concluso il codice .net e quindi portata la progressbar dell'installer alla fine e conclusa l'installazione normalmente. Quello che succede è questo:

 
Dentro alla form poi ho usato la solita tecnica di sempre per fare gli step del "mio wizard" tramite il TabControl, gestendo il SelectedIndex, nascondendo le tab in alto dietro ad una label fatta diventare "header grafico" della form stessa.
 
Tutto filava liscio fino a quando ho inserito la possibilità di far scegliere un path tramite "FolderBrowserDialog" di Windows (non c'è problema per l'OpenFileDialog o SaveFileDialog), infatti mi appariva la maschera senza la treeview esplorabile:
 

 
Fortunatamente però spulciando la rete ho trovato che il problema sta nel fatto che dentro al setup, il codice .net viene lanciato con un thread NON "Single Thread Apartment" (STAThread) , cosa che invece serve all'oggetto BrowseFolder per funzionare.
Perciò ho dovuto cambiare il codice, usando un thread e settando l'ApartmentState da codice:
 

Poco male, ho risolto velocemente questo piccolo intoppo, arrivando all'obbiettivo prefissato.


Conclusioni:
Anche se non è proprio "elegante" far uscire una WindowsForm sopra a quella di setup di Windows Installer, è comunque un buon compromesso perchè è possibile scrivere tutto il codice .net che si vuole, con la comodità che ne deriva.
Inoltre, non c'è nessun problema se nella macchina dove installate non si trova installato il framework, verrebbe installato come prerequisito dal pacchetto di installazione prima dell'evento "OnAfterInstall", quindi siamo sicuri di averlo disponibile.
Categoria: Tips
domenica, 10 mag 2009 Ore. 17.34

Messaggi collegati






  • Views Home Page: 243.216
  • Views Posts: 420.669
  • Views Gallerie: 564.863
  • n° Posts: 163
  • n° Commenti: 148
Anno 2014

Anno 2013

Anno 2012

Anno 2011

Anno 2010

Anno 2009

Anno 2008

Anno 2007

Anno 2006

Anno 2005
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003