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
Siete proprio sicuri?
Perchè estendere Visual Studio

• Compiti ripetitivi;
• Siamo pigri e usare sw diverso ci
  pesa;
• Integrare “new stuff” nella solution
  su cui stiamo lavorando;
Alcuni esempi di estensioni

• Domain Specific Language(s)
• Database Project
• Visual C#
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;
Gli Entry Point

• Macro
• AddIn
• Visual Studio Package;
• Language Service/System;
Extensibility Architecture
Visual Studio SDK: Basic Lifesupport System Kit

UN FARO NELLA NEBBIA...
Visual Studio 2008 SDK: Project

• Nuovi tipi di progetto
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;
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...;
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
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;
Anatomia di un VSPackage

VSPackage DEEP DIVE
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”;
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;
My First VSPackage: EmptyVSPackage

DEMO 1
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;
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);
Anatomia: le risorse

• Pro:
  – Supporto per la localizzazione;
• Contro:
  – Opzionali, ma non per tutto...;
  – Formati “diversi” per cose “uguali”;
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"
Anatomia: deploy
Complichiamoci la vita: un custom ProjectSystem

IL PROJECT.SYSTEM
ProjectSystem: Agenda

• I Template;
• Il Package;
• La ProjectFactory;
• Il ProjectNode;
• Il FileNode;
• Le FileNodeProperties;
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”;
ProjectSystem: Il Package

• L’attributo: ProvideProjectFactory
  – Informa VS di quale sia il System.Type
    deputato a creare il progetto;
• La registrazione delle factory;
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;
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;
ProjectSystem: Il FileNode

• Una classe che deriva da FileNode
• Override(s) sine qua non:
  – CreatePropertiesObject;
• Tip:
  – Le icone...;
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;
ProjectSystem

DEMO 2
Editor: Agenda

• LogicalView & PhysicalView;
• EditorFactory;
• EditorPane;
• DesignSurface;
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
Editor: EditorFactory
• Mappa Logical e Physical views:
  – Distingue la tipologia (Type) di editor in
    base alla logical/physical view;
• Gli attributi:
  – ProvideEditorFactory;
  – ProvideEditorLogicalView;
  – ProvideEditorExtension;
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;
Editor: DesignSurface

• ComponentDesigner;
• IRootDesigner;
• “Hosta” il controllo Windows Form
  – UserControl e Form sono IRootDesigner;
Editor

DEMO 3
Toolbox perchè sei tu Toolbox...

LA TOOLBOX
Toolbox: Agenda

• Gli attributi;
• Gli eventi;
• System.Reflection;
• CustomToolboxItem;
Toolbox: attributi

• ProvideToolboxItems:
  – Version:
    • Determina il comportamento della cache
  – NeedsCallBackAfterReset:
    • Dovrebbe scatenare l’evento
      ToolboxUpgraded...io non ci sono riuscito;
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
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);
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
Toolbox

DEMO 4
I problemi principali che dobbiamo affrontare

“È UN MONDO DIFICILE”                           <CIT.>
Visual Studio è COM

• Marshaling;
• Rilascio delle risorse;
• HRESULT vs. Exception;
• La gestione dei Guid;
...ma non è solo COM

• Trapping/Masking delle Exception;
• Il Discovery dei servizi;
• La documentazione;
• Le discrepanze:
  – Task ripetuti;
  – Linking dei template;
  – Duplicazione delle risorse;
Non sparate sul pianista....

DOMANDE?
Grazie a tutti, mi raccomando...

IL MODULO DI FEEDBACK

VS Package @ CD2008

  • 1.
    VSX Tales: EstendereVisual Studio VSPackage dalla A alla VS Mauro Servienti Microsoft MVP - Visual C# Software Mason @ Managed Designs S.r.l. mauro.servienti@manageddesigns.it
  • 2.
  • 3.
    Perchè estendere VisualStudio • Compiti ripetitivi; • Siamo pigri e usare sw diverso ci pesa; • Integrare “new stuff” nella solution su cui stiamo lavorando;
  • 4.
    Alcuni esempi diestensioni • Domain Specific Language(s) • Database Project • Visual C#
  • 5.
    Il “guscio” Con l’uscitadi 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;
  • 7.
  • 8.
    Visual Studio SDK:Basic Lifesupport System Kit UN FARO NELLA NEBBIA...
  • 9.
    Visual Studio 2008SDK: Project • Nuovi tipi di progetto
  • 10.
    Visual Studio 2008SDK: 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 • Progettodi 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;
  • 14.
    Anatomia di unVSPackage VSPackage DEEP DIVE
  • 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;
  • 17.
    My First VSPackage:EmptyVSPackage DEMO 1
  • 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 • Compilail 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"
  • 22.
  • 23.
    Complichiamoci la vita:un custom ProjectSystem IL PROJECT.SYSTEM
  • 24.
    ProjectSystem: Agenda • ITemplate; • 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;
  • 31.
  • 32.
    Editor: Agenda • LogicalView& PhysicalView; • EditorFactory; • EditorPane; • DesignSurface;
  • 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 • MappaLogical 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;
  • 36.
    Editor: DesignSurface • ComponentDesigner; •IRootDesigner; • “Hosta” il controllo Windows Form – UserControl e Form sono IRootDesigner;
  • 37.
  • 38.
    Toolbox perchè seitu Toolbox... LA TOOLBOX
  • 39.
    Toolbox: Agenda • Gliattributi; • 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 • Caricamentodegli 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 • Essenzialeper 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
  • 44.
  • 45.
    I problemi principaliche dobbiamo affrontare “È UN MONDO DIFICILE” <CIT.>
  • 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;
  • 48.
    Non sparate sulpianista.... DOMANDE?
  • 49.
    Grazie a tutti,mi raccomando... IL MODULO DI FEEDBACK