Particolarità del progetto
L'idea era questa: realizzare qualcosa che consentisse di scaricare in Excel quanto visualizzato nella Gridview di una pagina Web.
Come fare?
Inizialmente ho tentato la strade "tradizionale" di "renderizzare" in Excel il Gridview control visualizzato a video. Sebbene la cosa fosse abbastanza semplice da fare i limiti della soluzione erano evidenti:
- L'export funzionava per le sole righe visualizzare nel form
- la quantità di HTML prodotta faceva sì che i volumi e di consenguenza i tempi di apertura da parte di Excel del file HTML prodotto non fossero assolutamente accettabili.
Dopo aver tentato numerose altre vie fra le quali "Visual Studio Tools per
Office", grazie alla tecnologia "Microsoft Office Open XML" ho scoperto la
possibilità di generare fogli Excel 2003 in formato XML e fogli Excel 2007 in
formato XLSX.
Da qui è nato un progetto alquanto complesso, di cui, sulla destra, si può
vedere la finestra del Solution Explorer in Visual Studio 2008.
Ho utilizzato:
- Class Project per realizzare il prodotto vero e proprio, cioè l'Assembly che
installato nella Global Assembly Cache (GAC) del sistema, realizza gli export in
Excel 2003 o 2007
- ASP.NET per realizzare
- Windows Installer Project per realizzare il package di installazione
- Console Application Project per parametrizzare opportunamente i vari progetti a
seconda della "Configuration" della soluzione
- Windows Forms Project per realizzare un form di Installazione Licenza
Inoltre ho dovuto utilizzare Sql Server (ma solo per leggere dati dall'Adventure Works database di Microsoft) ed ho fatto una notevole esperienza di XML e di Microsoft Office Open XML.
Nel realizzare il progetto ho dovuto inoltre affrontare e risolvere, il modo economico,
anche il problema della "obfuscation" e della "Signature" di
tutte le parti di codice installate e Licensing.
Obfuscation
Per la obfuscation ho dovuto presto abbandonare l'idea di utilizzare .Net Obfuscator
già presente con funzionalità di base in Visual Studio. Le funzionalità offerte
sono veramente minime e non ho trovato supporto sufficiente per la Signature. Inoltre
il prezzo del prodotto su Internet si aggirava ai tempi dell'inizio del progetto
intorno ai 4000 Euro.
Essendo utente MSDN ho voluto provare i Microsoft Software Licensing and Protection Services di Microsoft
che in teoria avrebbe potuto risolvere sia il problema della Obfuscation, sia quello
del Licensing. Peccato che, dopo avere eseguito il percorso di demo, come suggerito
dal manuale, non fosse più possibile aprire un nuovo progetto di lavoro,
nè eliminare o rinominare quello di demo. Risolto questo problema con il personale
Microsoft che mi ha fornito un altro User ed un'altra password ho presto scoperto
che il sistema non era in grado di offuscare funzioni che utilizzavano parametri passati "byref".
Poiché questo avrebbe comportato la riscrittura ed
il test di buona parte del progetto ho preferito abbandonare anche questa strada
e tentare altro.
Finalmente, per la sola obfuscation, ho trovato {smartassembly} che ha reso necessario un pò di lavoro per
essere integrato in Visual Studio ma alla fine si è rivelato duttile ed economico.
Un suggerimento per chi volesse utilizzarlo: utilizzate i pre-build ed i post-buid
events di ciascun progetto per richiamare dei .cmd o, eventualmente un eseguibile
scritto appositamente per eseguire la obfuscation.
Signature
Anche per la Signature dei singoli moduli da installare ho dovuto utilizzare i post-build
events. Il certificato con cui sono "signed" i vari moduli è stato invece
acquistato dalla Thawte.
Licensing
Per il Licensing ho utilizzato un sistema che funziona in modo diverso a seconda
del momento
Alla prima installazione del prodotto c'è la necessità di fornire immediatamente
una Licenza gratuita che può essere definitiva, se il sistema è Window XP oppure
Windows Vista, oppure temporanea se il sistema operativo è Windows Server 2003 oppure
Windows Server 2008.
In questo caso il sistema in corso di installazione, individuato il tipo di sistema
instaura un colloquio con un un web Service appositamente realizzato che esegue
i seguenti passi:
- al momento dell'installazione della licenza il Client legge il tipo di sistema
operativo, il codice di licenza di Windows e la data e l'ora di installazione.
In particolare il numero di licenza Windows e l'orario di installazione costituiscono
una chiave univoca per identificare la macchina del cliente
- il Client richiede una Licenza temporanea al Web Service
- Il Web Service, dopo aver verificato la validità della richiesta, genera un nuovo
Codice di Licenza e lo invia al Client
- Il Client, in possesso di una Licenza, invia a questo punto al Web Service
una richiesta di installazione
- Il Web Service, registrata la richiesta ed effettuati i necessari controlli di
coerenza fra Sistema richiedente e Licenza in corso di installazione, genera ed
invia al Client una Activation Key
- il Client installa la activation Key e quindi trasmette al web Service il
segnale di licenza installata.
Quando il Cliente è entrato in possesso di una Licenza a pagamento, dovrà utilizzare un Form, che viene installato contestualmente al prodotto, per effettuare la registrazione e l'attivazione della Licenza.
Questo form instaura con il Web Service un colloquio di questo tipo:
- legge il tipo di sistema operativo, il codice di licenza di Windows e la data e
l'ora di installazione.
- il sistema trasmette i dati letti al passo precedente, oltre il numero di
Licenza che l'utente avrà specificato nel form di installazione, al Web Service,
facendo richiesta di installazione di una Licenza defintiva a pagamento (solo
per Windows Server 2003 e Windows Server 2008)
- il web Service, verifica che la Licenza sia valida, che non sia stata
installata altrove, quindi genera una Activation Key e la invia al Client
- il Client installa la activation Key e quindi trasmette al web Service il
segnale di licenza installata.