The road to a Service Oriented Architecture is paved with messages
VS Package @ CD2008
1. VSX Tales: Estendere Visual
Studio
VSPackage
dalla A alla VS
Mauro Servienti
Microsoft MVP - Visual C#
Software Mason @ Managed Designs S.r.l.
mauro.servienti@manageddesigns.it
3. Perchè estendere Visual Studio
• Compiti ripetitivi;
• Siamo pigri e usare sw diverso ci
pesa;
• Integrare “new stuff” nella solution
su cui stiamo lavorando;
4. Alcuni esempi di estensioni
• Domain Specific Language(s)
• Database Project
• Visual C#
5. Il “guscio”
Con l’uscita di Visual Studio 2008 viene introdotto il
concetto di Shell:
Integrated Isolated
• Integrazione con • Esecuzione Side by Side;
l’edizione di VS presente; • Custom look & feel;
• Installazione di un “VS • Pieno accesso ai servizi
Redist”; di VS;
• Ideale per lo sviluppo di • Possibilità di nascondere
language service e/o tool funzionalità;
di supporto;
6. Gli Entry Point
• Macro
• AddIn
• Visual Studio Package;
• Language Service/System;
10. Visual Studio 2008 SDK: Docs
• “documentazione” (lower d):
– “...spiega nel dettaglio cosa sia un
mattone dando per scontato che questo
sia sufficiente per costruire una casa...”;
– Disallineata dalla versione di VS;
– Esempi lasciano molto a desiderare;
11. Visual Studio SDK: MPF
• MPF: Managed Package Framework:
– Un set di API sopra gli Interop
Assemblies;
– Semplifica di molto lo sviluppo:
• da 5k a poche decine di linee di codice;
– Non è un set di assembly...;
12. Visual Studio SDK: Experimental Hive
• Pargonabile ad un ambiente virtuale;
– SoftwareMicrosoftVisualStudio9.0Exp;
– Protegge la nostra installazione di VS;
• Reset tool;
– Tip: se cambiate profilo utente è
necessario eseguire un reset;
• /RANU: Run As Normal User
13. VSSDK Assist
• Progetto di supporto open source:
– http://www.codeplex.com/vssdkassist
• Aggiunge “funzionalità” ai progetti
esistenti
– Gli scheletri creati sono decisamente più
ricchi;
– Aggiunge tool per il debug;
15. VSPackage: the basics
• È un contenitore di servizi;
– Può essere un Project System;
– Può essere un Language System;
• Offre supporto per:
– Branding: eg. l’about box di VS;
– Persistenza dello stato del progetto;
– Intergrazione nelle Opzioni di VS
– Supporto per “custom properties”;
16. DLK & PLK
• DLK: Dev Licence Key
– Installata insieme all’SDK;
– Consente di eseguire tutte le operazioni di
sviluppo;
– Non consente il deploy;
• PLK: Package Load Key (sparirà?)
– Da richiedere on line (free);
– Univoca per VSPackage;
• Company, Version, PkgName, TargetVersion
– Firma i VSPackage;
• VS non carica il package se non valida;
18. Anatomia: gli attributi
• [Guid]:
– univoco per VSPackage;
– È COM: ogni cosa è un Guid/CLSID;
• [InstalledProductRegistration]:
– Fornisce le informazioni di supporto per
la registrazione;
• [ProvideLoadKey]:
– Fornisce le informazioni per il
caricamento del package: tra cui la PLK;
19. Anatomia: i Guid
• Siamo nel regno di COM:
– Identifichiamo tutto con un Guid/CLSID;
• Cerchiamo di cavarcela:
– const string gVSPkgString = “...";
– const string gVSPkgCmdSetString =
“…";
– static readonly Guid gVSPkgCmdSet =
new Guid(gVSPkgCmdSetString);
20. Anatomia: le risorse
• Pro:
– Supporto per la localizzazione;
• Contro:
– Opzionali, ma non per tutto...;
– Formati “diversi” per cose “uguali”;
21. Anatomia: Build
• Compila il package:
– csc.exe EmptyVSPackage ->
EmptyVSPackage.dll
• Installa le informazioni di configurazione del
package nell’Experimental Hive:
– RegPkg.exe
/root:SoftwareMicrosoftVisualStudio9.0Exp
"/pkgdeffile:EmptyVSPackage.pkgdef"
"EmptyVSPackage.dll"
• Esegue il deploy nell’Experimental Hive
– RegPkg.exe
/root:SoftwareMicrosoftVisualStudio9.0Exp
/ranu /codebase "EmptyVSPackage.dll"
24. ProjectSystem: Agenda
• I Template;
• Il Package;
• La ProjectFactory;
• Il ProjectNode;
• Il FileNode;
• Le FileNodeProperties;
25. ProjectSystem: I Template
• Definiscono la struttura iniziale:
– di un progetto (ProjectTemplate)
– di un elemento (ProjectItem);
• Sono file zip:
– %ProgramFiles%Microsoft Visual Studio 9.0Common7IDE
• Nuove “Build Action”:
– ZipProject e ZipItem;
• vstemplate:
– Il tag <ProjectType>: fondamentale;
– Il <TemplateContent>;
– Le “sostituzioni”;
26. ProjectSystem: Il Package
• L’attributo: ProvideProjectFactory
– Informa VS di quale sia il System.Type
deputato a creare il progetto;
• La registrazione delle factory;
27. ProjectSystem: La ProjectFactory
• Una classe che deriva da ProjectFactory
• Definizione di un Guid;
• Eseguire l’override di CreateProject;
– Creazione della propria istanza di project;
– Impostazione del service container:
• senza il quale non saremmo in grado di
comunicare con l’ambiente;
• Qui è anche possibile definire le
proprietà custom del progetto;
28. ProjectSystem: Il ProjectNode
• Una classe che deriva da ProjectNode
– Rappresenta un nodo nel Solution Explorer;
• Override(s) sine qua non:
– CreateFileNode;
– AddFileFromTemplate;
– ProjectGuid;
– ProjectType:
• Vi ricordate il tag <ProjectType> nel file .vstemplate?
• Tip:
– CanProjectDeleteItems = true
– Le icone...;
– Le custom properties;
29. ProjectSystem: Il FileNode
• Una classe che deriva da FileNode
• Override(s) sine qua non:
– CreatePropertiesObject;
• Tip:
– Le icone...;
30. ProjectSystem: Le FileNodeProperties
• Una classe che deriva da
NodeProperties;
• Espone proprietà pubbliche che VS
visualizza nella property grid;
• È possibile inserire tutte le proprietà
che vogliamo associare al nostro
documento;
– Tip: sono persistite nel file di
progetto, avete quindi bisogno di
mappare tag/attributi custom;
33. Editor: LogicalView & PhysicalView
• Un singolo documento/file può avere più
modalità di visualizzazione: LogicalView
• Le modalità di visualizzazione hanno uno o
più editor collegati: PhisycalView
• Alcuni esempi:
– Windows Form:
• Design View
• Code View;
– Web Designer:
• Design View;
• HTML View;
• Code View
34. Editor: EditorFactory
• Mappa Logical e Physical views:
– Distingue la tipologia (Type) di editor in
base alla logical/physical view;
• Gli attributi:
– ProvideEditorFactory;
– ProvideEditorLogicalView;
– ProvideEditorExtension;
35. Editor: EditorPane
• E’ il prodotto di una EditorFactory;
• IWin32Window property;
• Può implementare IVsToolboxUser
– IsSupported: determina se un
determinato “tool” sia supportato o
meno d’editor corrente;
– ItemPicked: l’IDE ci informa che un
“tool” è stato scelto: DblClick / enter;
39. Toolbox: Agenda
• Gli attributi;
• Gli eventi;
• System.Reflection;
• CustomToolboxItem;
40. Toolbox: attributi
• ProvideToolboxItems:
– Version:
• Determina il comportamento della cache
– NeedsCallBackAfterReset:
• Dovrebbe scatenare l’evento
ToolboxUpgraded...io non ci sono riuscito;
41. Toolbox: Gli Eventi
• ProjectPackage.ToolboxInitialized:
– Invocato durante il processo di
inizializzazione della toolbox;
– E’ qui che dobbiamo inserire i nostri
ToolboxItem/Category
• ProjectPackage.ToolboxUpgraded:
– Invocato al cambio di “versione”;
– Rimuoviamo e reinseriamo i
ToolboxItem/Category
42. Toolbox: System.Reflection
• Caricamento degli elementi:
– Fx2.0:ToolboxService
(System.Drawing.Design);
• ToolboxItemAttribute;
• ToolboxBitmapAttribute;
• ToolboxItemFilter
• DisplayName: brutalmente ignorato;
• Tip:
– Siete in un AppDomain diverso da quello
dell’IDE AssemblyResolve issue(s);
43. Toolbox: CustomToolboxItem
• Essenziale per identificare i nostri
elementi;
• Possibilità di estendere le
informazioni inserite nella Toolbox;
• Tip:
– Deriva da ToolboxItem;
– Deve essere serializzabile;
– ToolboxItem implementa a “modo suo”
ISerilizable
46. Visual Studio è COM
• Marshaling;
• Rilascio delle risorse;
• HRESULT vs. Exception;
• La gestione dei Guid;
47. ...ma non è solo COM
• Trapping/Masking delle Exception;
• Il Discovery dei servizi;
• La documentazione;
• Le discrepanze:
– Task ripetuti;
– Linking dei template;
– Duplicazione delle risorse;