VSTO e il Manifest

Sto cominciando a studiare bene la nuova versione dei Visual Studio Tools For Office e uno degli aspetti che è stato completamente trasformato rispetto alla versione precedente è la gestione degli aggiornamento. VSTO 2.0 utilizza un sistema simile a quello utilizzato da ClickOnce (non sono però le stesse dll). In pratica il sistema è composto da :

  1. Il documento Word o Excel (e presto anche Outlook :-))
  2. Un file XML detto Application Manifest che contiene tutte le informazioni riguardante una certa versione dell'applicazione. All'interno di questo file c'è scritto come è composta la soluzione, quali sono i file e da dove devono essere recuperati
  3. Un file XML detto Deploy Manifest che serve semplicemente per aggiornare l'Application Manifest

Il sistema è molto semplice e per questo molto funzionale: quando si apre un documento (facciamo per esempio un doc) Word vede se associato al documento (e qui sta il bello) esiste un application Manifest. Se presente Word legge all'interno dell' Application Manifest la versione attuale dell'Applazione (esempi 1.0) e poi vede dove si trova il Deploy Manifest. A questo punto si collega e scarica il deploy manifest e vede al suo interno qual'è l'ultima versione valida dell'Application Manifest e se è la 1.0 per esempio non fa nulla, se è 1.1 allora scarica l'Applicaiton Manifest nuovo. A questo punto analizza l'Application Manifest e va eventualmente a scaricare le dll .NET. In questo modo posso fare autodeployment dei file e dell'intera soluzione.

Bene, fino a qui nulla di nuovo se non fosse che quando create un progetto con VS2005 di tipo Office, dell'Application Manifest e del Deploy Manifest non c'è traccia. Per capire come funziona ho chiesto una mano preziosa a Mario Esposito un caro amico che lavora direttamente a Redmond nel team di sviluppo di VSTO e mi ha spiegato finalmente l'arcano (grazie Mario :)). All'interno del documento viene memorizzato un ID (clsid) che in pratica dice a Word che esiste una soluzione VSTO. A questo punto Word legge direttamente all'interno del documento stesso l'Application Manifest e il Deploy Manifest che vivono nel documento. La domanda quindi è , come faccio a cambiare l'Application Manifest e il Deploy Manifest. Ed ecco la risposta sempre da Mario: per cambiare l'Application Manifest è necessario utilizzare la classe ServerDocument dei VSTO. Di seguito un semplice esempi scritto da lui che legge il Manifest:

ServerDocument sd = new ServerDocument(doc);
Console.WriteLine(sd.AppManifest.ToXml()); 
if (sd.AppManifest.EntryPoints.Count > 0)
      Console.WriteLine("ClassName {0}", sd.AppManifest.EntryPoints[0].ClassName);
sd.Close();

Leggo il manifest da un file esterno e lo inserisco nel documento:

StreamReader f = System.IO.File.OpenText(mf);
string man = f.ReadToEnd();
sd.AppManifest.FromXml(man);
f.Close();
sd.Save();
sd.Close();

A meno che Mario non commenti questo blog dicendo che è tutto sbagliato quello che ho scritto :-) dovrebbe essere proprio così.