Il seguente articolo chiarisce 4 punti:
1- come creare un progetto di distribuzione (o installazione);
2- come inserire nuove finestre di dialogo al progetto di distribuzione;
3- come estendere la classe Installer (creazione dll) ed associarla al progetto di distribuzione;
4- come poter effettuare il passaggio dei parametri tra il progetto di distribuzione
e la dll che estende la classe Installer.
(Codice C#)
Partiamo dal primo punto, come creare un progetto di distribuzione:
per prima cosa vi conviene creare per esempio una semplice applicazione Windows con C# che chiameremo Test.
Una volta creata, andare nel menu File, cliccare su Aggiungi Progetto -> Nuovo progetto.
Scegliere la voce "Progetto di Installazione e Distribuzione", assegnare un nome al Progetto e dare Ok.
A questo punto si dovrebbe aprire in automatico il File System del progetto di Installazione, se non fosse così selezionare il progetto di distribuzione in Esplora Soluzioni e dal menu Visualizza, scegliere la voce Editor->File System.
Sarà possibile vedere 3 cartelle: Cartella Applicazione, Desktop utente e Manu Programmi Utente.
Cliccare su cartella applicazione con il tasto sx del mouse e cliccare su Aggiungi->Output Progetto.
In automatico verrà scelto il progetto da associare, ovvero Test.
Selezionare la voce "Output primario" e dare ok.
A questo punto aggiungiamo una finestra di dialogo al progetto.
Dal menu Visualizza, scegliere la voce Editor-> Interfaccia Utente, così facendo possiamo vedere l'elenco delle finestre di dialogo che verranno visualizzate durante l'installazione del programma Test.
Per esempio inseriamo una finestra di dialogo con 2 CheckBox.
Per fare questo bisogna cliccare con il tasto sinistro del mouse sulla voce "Avvio" e cliccare su Agguingi
finestra di dialogo.A questo punto viene visualizzato un elenco di finestre di dialogo che si possono aggiungere, alcune contengono radio button, altre semplici label, ecc...
Nel nostro caso aggiungiamo una Casella di Controllo e la inseriamo tra "Introduzione" e "Cartella di Installazione".
N.B. Per spostare le finestre di dialogo basta trascinarle con il mouse.
Se guardiamo le proprietà della finestra di dialogo possiamo notare che ci sono 4 CheckBox ognuna delle quali ha:
- una Label o etichetta della casella di controllo;
- una Property ovvero il nome della casella di controllo. Questo valore è molto importante perchè servirà quando dovremmo passare dei valori alla classe Installer.
- un valore che indica se la check Box risultà già spuntata;
- un valore che indica se la check Box è visibile.
Per es. sulla label della prima check Box scriviamo "Crea File" e sulla label della seconda check box scriviamo "Elimina File" mentre le altre due check box le rendiamo "non visibili".
Passiamo al p.to 3 ovvero alla creazione della dll.
E' necessario avviare un'altro progetto come libreria di classi.
A questo punto la classe la definiamo così:
using System;
using System.ComponentModel;
using System.Collections;
using System.Configuration.Install;
namespace XXInstaller
{
[RunInstaller(true)]
public class MyInstaller: Installer
{
public MyInstaller()
{
}
public override void Install(IDictionary savedState)
{
base.Install(savedState);
}
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
}
}
}
In questo modo ridefiniamo le funzioni Install, Commit, Rollback e Unistall.
Compiliamo il progetto e generiamo la dll.
La nostra dll per ora non fa niente di particolare..richiama solamente le funzioni della classe Installer.
Attenzione che MSDN dice che è necessario, senza darne un motivo ben preciso, che la chiamata alla classe base avvenga prima del codice "custom"!!!
A questo associamo la dll al nostro progetto di distribuzione.
Visualizzare l'editor del file system e con il tasto destro del mouse cliccare su "Cartella Applicazione" e aggiungere la dll appena creata al progetto di installazione.
A questo punto visualizzare l'editor delle azioni personalizzate, cliccare sempre con il tasto destro del mouse su "Azione personalizzata" e sceglire la voce "Aggiungi azione personalizzata". Viene aperta una finestra dalla quale effettuare la scelta, quindi cliccare su "Cartella Applicazione" e scegliere la dll che è stata aggiunta
precedentemente al progetto di installazione.
4. Ora passiamo ad analizzare come effettuare il passaggio dei parametri dal progetto di installazione
alla dll che estende la classe Installer.
Per prima cosa nel progetto di installazione dobbiamo:
1. visualizzare l'editor delle azioni personalizzate dove precedentemente avevamo associato la nostra dll ai metodi Install, Commit, Rollback e Unistall.
2.Visualizzaziamo le proprietà della dll relativa al metodo Install.
Possiamo notare la proprietà CustomActionData che serve proprio per passare i parametri al metodo Install relativo.
Allora su CustomActionData scriveremo:
/nome1=[CHECKBOXA1] /nome2=[CHECKBOXA2]
dove CHECKBOXA1 e CHECKBOXA2 sono i nomi delle caselle di controllo.
Mentre nome1 e nome2 siamo noi ad assegnarli, sono praticamente i nomi delle variabili che passaremo alla dll.
La proprietà CustomActionData assume il formato /nome=valore.
Più valori devono essere separati da uno spazio singolo: /nome1=valore1 /nome2=valore2.
Se un valore ha uno spazio al suo interno, deve essere racchiuso fra virgolette:
/nome="un valore".
Le proprietà di Windows Installer possono essere passate utilizzando le parentesi quadre: /nome=[NOMEPROPRIETÀ].
A questo punto passiamo ad aggiungere un po' di codice sul progetto di estensione della classe Installer. In questo caso inserisco solamente il codice delle modifiche al metodo Install:
public override void Install(IDictionary savedState)
{
base.Install(savedState);
//System.Diagnostics.Debugger.Break();
string nome1 = this.Context.Parameters["nome1"];
string nome2 = this.Context.Parameters["nome2"];
/*
Le variabili nome1 e nome2 possono assumere valore 1 se sono
state spuntate, altrimenti possono assumere valore 0 oppure
valore nullo. Per non dover controllare sempre se nome1 e nome2
sono uguali a 0 o a null...eseguo l'assegnazione seguente.
*/
if (nome1 != "1")
nome1 = "0";
if (nome2 != "1")
nome2 = "0";
/*
* Se per caso non è spuntata nè nome1 nè nome2 allora blocco l'installazione
**/
if (nome1 == "0" && nome2 == "0")
{
throw new Exception("Deve essere spuntata almeno una delle due opzioni!");
}
if (nome1 == "1")
{
//Creazione di un file
try
{
FileInfo fi = new FileInfo(@"C:\testInstaller.txt");
if (fi.Exists == false)
fi.Create();
}
catch(Exception){}
}
if (nome2=="1")
{
//Eliminazione del file
try
{
FileInfo fi = new FileInfo(@"C:\testInstaller.txt");
if (fi.Exists == true)
fi.Delete();
}
catch(Exception){}
}
}
A questo punto ricreare la dll.
Creare il progetto di installazione, fare attenzione a prendere la dll con l'estensione della classe Installer appena creata!
A questo punto il nostro progetto di installazione è completato!