Nel post precedente abbiamo visto brevemente come creare un
setup (semplice semplice) per fare il deploy della nostra applicazione. Con
"semplice semplice" intendo dire che facciamo la copia dei files inclusi nel
progetto sul PC dell'utente finale, senza fare nulla di particolare. Abbiamo
visto che le dipendenze non sono più così importanti come nell'era DLL/OCX pre
.NET. Gli assembly devono/possono essere copiati nella
directory dell'applicazione stessa, oppure installati nella GAC se vogliamo che siano condivise fra
più di una applicazione. Facciamo questa operazione aggiungendo banalmente i files nel
nodo Application Folder.
Nel folder User's Desktop e in User's Programs Menu
mettiamo gli shortcuts che vogliamo dare all'utente per lanciare
l'applicazione. Nel primo caso sul Desktop, nel secondo caso nel menù
Start di Windows.
Aggiungiamo qualche dettaglio...le Launch
Conditions
Cos'è una "launch condition"? Come dice il nome stesso, si tratta di
una condizione che il motore Windows Installer deve verificare per poter dare il
suo consenso alla continuazione del setup.
Se la condizione è
rispettata, ok. Se non è rispettata, appare un messaggio di errore (che
decidiamo noi) e il setup abortisce inesorabilmente.
Facciamo qualche esempio interessante. Lanciamo Visual Studio, apriamo la
soluzione che abbiamo creato, andiamo sotto il menù View
--> Editor --> Launch Condition. Appare una nuova finestra con
una bella TreeView che comprende due nodi: Search Target
Machine e Launch Conditions. Il primo nodo serve per
impostare il criterio che deve essere soddisfatto (basandosi su una ricerca su
un file, su una chiave di registro o su un componente MSI), il secondo per
indicare cosa deve apparire nel caso in cui la condizione non fosse
soddisfatta.
Premetto che le chiavi di registro che
andrò ad indicare sono a solo scopo didattico. Non ho testato (purtroppo) se sono
veramente valide per l'obiettivo che voglio raggiungere. Correggetemi!
Torniamo a noi.
Supponiamo di voler consentire l'installazione della nostra applicazione solo
se abbiamo un SQL Server che gira su localhost, ovvero sul PC
locale. Ho fatto un giro nel registry e ho trovato la seguente key:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion
mi aspetto che questa chiave di registry esista solo sui PC
che hanno un'istanza di SQL Server installata. Aggiungiamo la Launch Condition basandoci
su questa key. Clicchiamo con il destro su Search Target
Machine, poi su Add Registry Search ed assegniamo le
seguenti properties:
(name) = SQL Server on local machine
(Property) = SQLSERVER
(RegKey) =
SOFTWARE\Microsoft\MSSQLServer\MSSQLServer\CurrentVersion
(Root) =
vsdrrHKLM
(Value) = CurrentVersion
Al momento del lancio di setup.exe, Windows Installer
ricercherà questa chiave nel nostro registry e ci restituirà il valore di
CurrentVersion. Provate a dare un'occhiata nel vostro registry. Io in
CurrentVersion ho "8.00.194". Questa stringa viene salvata in SQLSERVER. A
questo punto possiamo tranquillamente impostare la launch condition che
vogliamo. Clicchiamo con il destro su Launch Conditions, poi su
Add Launch Condition. Assegniamo le
seguenti properties:
(Name) = SQL Server on local machine
(Condition) = SQLSERVER
(Message)
= You don't have SQL Server on your local machine!
Fatto, tutto qua. Fate la build del progetto e provate a
lanciare l'install dello stesso. Se quella chiave esiste, il setup prosegue,
altrimenti viene abortito e viene mostrato il [Message]. Uao!!!
Avremmo potuto seguire la stessa logica
con un File Search, ricercando "sqlservr.exe" sul PC
dell'utente. Se esiste, bene, altrimenti terminiamo bruscamente il setup. Il
problema in questo caso è che non sappiamo a priori la directory di
installazione di SQL Server: possiamo impostare il Folder iniziale ed un Depth
per indicare quante subdir vogliamo esplorare per ricercare il file. Potremmo
iniziare la ricerca da [ProgramFiles], ma potrebbe essere comunque inaffidabile,
perchè magari l'utente (per farsi male) ha installato SQL Server in F:\, oppure
in C:\SQLSERVER2000, ed in tal caso rischieremmo di abortire senza un valido
motivo. Forse è meglio il registry. Comunque sia, la logica è sempre
la stessa.
Miglioriamo le Launch Conditions
Nell'esempio di
prima abbiamo usato la proprietà SQLSERVER come booleana. Ovvero, la
presenza/assenza di una determinata chiave di registro causa il
proseguimento/interruzione del setup. Possiamo fare di meglio. SQLSERVER infatti
non contiene true/false, ma
contiene il valore contenuto nella chiave di registro indicata. Nel mio caso,
appunto, "8.00.194". La condition può quindi assumere diverse forme:
SQLSERVER = "8.00.194"
Ok solo se la versione è
esattamente quella che ho io, ovvero "8.00.194".
SQLSERVER > "8.00.193"
Ok solo se la versione è
successiva a quella indicata
SQLSERVER <> "8.00.193"
Ok solo se la versione
è diversa a quella indicata
E così via. In pratica, possiamo usare i normali operatori aritmetici per
selezionare meglio quello che vogliamo. Forte! Chissà quali
classi/funzioni/operatori possiamo utilizzare in questa piccola casellina?
Per ogni Launch Condition possiamo specificare anche un URL. In tal caso, la
finestra di errore riporta un pulsante Yes e un
No. Se clicchiamo Yes, si aprirà il browser predefinito all'URL
che abbiamo indicato. Da notare che dovremmo modificare [Message] per far capire
all'utente cosa succede se clicca Yes oppure No.
Ecco altri esempi tratti dal registry, tutti da verificare.
E' installato MSN Messenger? Quale
versione?
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSNMessenger\BgDlJobVer
E' installato IMHO?
HKEY_LOCAL_MACHINE\SOFTWARE\Elite
Agency\Imho
Sono installate le DirectX? Quale
versione?
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectX\Version
Non oso immaginare a quali esigenze potremmo far fronte leggendo il
registro e decidendo automaticamente determinate cose in fase di
installazione.