SlideShare uma empresa Scribd logo
1 de 49
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

Mais conteúdo relacionado

Semelhante a VS Package @ CD2008

Meetup Azure DevOps
Meetup Azure DevOpsMeetup Azure DevOps
Meetup Azure DevOpsdotnetcode
 
Meetup Azure DevOps
Meetup Azure DevOpsMeetup Azure DevOps
Meetup Azure DevOpsdotnetcode
 
High specialized vm on open stack cloud
High specialized vm on open stack cloudHigh specialized vm on open stack cloud
High specialized vm on open stack cloudGabriele Baldoni
 
Agileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaAgileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaXPeppers
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS BuildGian Maria Ricci
 
WhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiWhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiMarco Gasparetto
 
Sencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codiceSencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codiceGiuseppe Toto
 
Real world Visual Studio Code
Real world Visual Studio CodeReal world Visual Studio Code
Real world Visual Studio CodeRoberto Messora
 
Livin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzioneLivin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzionegiacomos
 
DbUp - A real case of database migration
DbUp - A real case of database migrationDbUp - A real case of database migration
DbUp - A real case of database migrationAndrea Cirioni
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationTiziano Serritella
 
Database project alla riscossa
Database project alla riscossaDatabase project alla riscossa
Database project alla riscossaGian Maria Ricci
 
Distribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradleDistribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradlePaolo Montalto
 
AWS CDK infrastructure is code
AWS CDK infrastructure is codeAWS CDK infrastructure is code
AWS CDK infrastructure is codeEnrico Pesce
 
Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101DotNetCampus
 

Semelhante a VS Package @ CD2008 (20)

Meetup Azure DevOps
Meetup Azure DevOpsMeetup Azure DevOps
Meetup Azure DevOps
 
Meetup Azure DevOps
Meetup Azure DevOpsMeetup Azure DevOps
Meetup Azure DevOps
 
High specialized vm on open stack cloud
High specialized vm on open stack cloudHigh specialized vm on open stack cloud
High specialized vm on open stack cloud
 
Agileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastrutturaAgileday2013 pratiche agili applicate all'infrastruttura
Agileday2013 pratiche agili applicate all'infrastruttura
 
Integrazione continua con TFS Build
Integrazione continua con TFS BuildIntegrazione continua con TFS Build
Integrazione continua con TFS Build
 
WhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessiWhyMCA12 - Android Tools e la gestione di progetti complessi
WhyMCA12 - Android Tools e la gestione di progetti complessi
 
Sencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codiceSencha touch: panoramica e orientamento sul codice
Sencha touch: panoramica e orientamento sul codice
 
Real world Visual Studio Code
Real world Visual Studio CodeReal world Visual Studio Code
Real world Visual Studio Code
 
Livin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzioneLivin' with Docker - dallo sviluppo alla produzione
Livin' with Docker - dallo sviluppo alla produzione
 
ASP.NET Core essentials
ASP.NET Core essentialsASP.NET Core essentials
ASP.NET Core essentials
 
Web frameworks
Web frameworksWeb frameworks
Web frameworks
 
DbUp - A real case of database migration
DbUp - A real case of database migrationDbUp - A real case of database migration
DbUp - A real case of database migration
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automation
 
Database project alla riscossa
Database project alla riscossaDatabase project alla riscossa
Database project alla riscossa
 
Intel AppUp Webinar Italiano html5
Intel AppUp Webinar Italiano html5Intel AppUp Webinar Italiano html5
Intel AppUp Webinar Italiano html5
 
Distribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradleDistribuire una libreria Java per usarla come dipendenza gradle
Distribuire una libreria Java per usarla come dipendenza gradle
 
AWS CDK infrastructure is code
AWS CDK infrastructure is codeAWS CDK infrastructure is code
AWS CDK infrastructure is code
 
Fe04 angular js-101
Fe04   angular js-101Fe04   angular js-101
Fe04 angular js-101
 
Tfs Basic - Quick Intro
Tfs Basic - Quick IntroTfs Basic - Quick Intro
Tfs Basic - Quick Intro
 
Web frameworks
Web frameworksWeb frameworks
Web frameworks
 

Mais de Mauro Servienti

Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019Mauro Servienti
 
Designing a ui for microservices @ .NET Day Switzerland 2019
Designing a ui for microservices @ .NET Day Switzerland 2019Designing a ui for microservices @ .NET Day Switzerland 2019
Designing a ui for microservices @ .NET Day Switzerland 2019Mauro Servienti
 
Welcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise ApplicationsWelcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise ApplicationsMauro Servienti
 
All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019Mauro Servienti
 
Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019Mauro Servienti
 
Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...Mauro Servienti
 
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019Mauro Servienti
 
Living organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better ParmaLiving organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better ParmaMauro Servienti
 
Welcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted SoftwareWelcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted SoftwareMauro Servienti
 
PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018Mauro Servienti
 
Design a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT BetterDesign a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT BetterMauro Servienti
 
Microservices and pineapple on pizza what do they have in common - dos and ...
Microservices and pineapple on pizza   what do they have in common - dos and ...Microservices and pineapple on pizza   what do they have in common - dos and ...
Microservices and pineapple on pizza what do they have in common - dos and ...Mauro Servienti
 
All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)Mauro Servienti
 
Designing a ui for microservices
Designing a ui for microservicesDesigning a ui for microservices
Designing a ui for microservicesMauro Servienti
 
Po is dead, long live the po
Po is dead, long live the poPo is dead, long live the po
Po is dead, long live the poMauro Servienti
 
Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!Mauro Servienti
 
GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?Mauro Servienti
 
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
Dall'idea al deploy   un lungo viaggio che passa per git flow e semverDall'idea al deploy   un lungo viaggio che passa per git flow e semver
Dall'idea al deploy un lungo viaggio che passa per git flow e semverMauro Servienti
 
Progettare una UI per i Microservices
Progettare una UI per i MicroservicesProgettare una UI per i Microservices
Progettare una UI per i MicroservicesMauro Servienti
 
The road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messagesThe road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messagesMauro Servienti
 

Mais de Mauro Servienti (20)

Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019Welcome to the (state) machine @ ExploreDDD 2019
Welcome to the (state) machine @ ExploreDDD 2019
 
Designing a ui for microservices @ .NET Day Switzerland 2019
Designing a ui for microservices @ .NET Day Switzerland 2019Designing a ui for microservices @ .NET Day Switzerland 2019
Designing a ui for microservices @ .NET Day Switzerland 2019
 
Welcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise ApplicationsWelcome to the (state) machine @ Xe One Day Enterprise Applications
Welcome to the (state) machine @ Xe One Day Enterprise Applications
 
All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019All our aggregates are wrong @ NDC Copenhagen 2019
All our aggregates are wrong @ NDC Copenhagen 2019
 
Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019Be like water, my friend @ Agile for Innovation 2019
Be like water, my friend @ Agile for Innovation 2019
 
Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...Microservices architecture is it the right choice to design long-living syste...
Microservices architecture is it the right choice to design long-living syste...
 
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
Titles, abstracts, and bio matter... oh my! @ Global Diversity CFP Day 2019
 
Living organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better ParmaLiving organizations, particular software @ do IT Better Parma
Living organizations, particular software @ do IT Better Parma
 
Welcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted SoftwareWelcome to the (state) machine @ Crafted Software
Welcome to the (state) machine @ Crafted Software
 
PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018PO is dead, long live the PO - Italian Agile Day 2018
PO is dead, long live the PO - Italian Agile Day 2018
 
Design a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT BetterDesign a UI for your Microservices @ Do IT Better
Design a UI for your Microservices @ Do IT Better
 
Microservices and pineapple on pizza what do they have in common - dos and ...
Microservices and pineapple on pizza   what do they have in common - dos and ...Microservices and pineapple on pizza   what do they have in common - dos and ...
Microservices and pineapple on pizza what do they have in common - dos and ...
 
All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)All our aggregates are wrong (ExploreDDD 2018)
All our aggregates are wrong (ExploreDDD 2018)
 
Designing a ui for microservices
Designing a ui for microservicesDesigning a ui for microservices
Designing a ui for microservices
 
Po is dead, long live the po
Po is dead, long live the poPo is dead, long live the po
Po is dead, long live the po
 
Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!Shipping code is not the problem, deciding what to ship it is!
Shipping code is not the problem, deciding what to ship it is!
 
GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?GraphQL - Where are you from? Where are you going?
GraphQL - Where are you from? Where are you going?
 
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
Dall'idea al deploy   un lungo viaggio che passa per git flow e semverDall'idea al deploy   un lungo viaggio che passa per git flow e semver
Dall'idea al deploy un lungo viaggio che passa per git flow e semver
 
Progettare una UI per i Microservices
Progettare una UI per i MicroservicesProgettare una UI per i Microservices
Progettare una UI per i Microservices
 
The road to a Service Oriented Architecture is paved with messages
The road to a Service Oriented Architecture is paved with messagesThe road to a Service Oriented Architecture is paved with messages
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;
  • 8. Visual Studio SDK: Basic Lifesupport System Kit UN FARO NELLA NEBBIA...
  • 9. Visual Studio 2008 SDK: Project • Nuovi tipi di progetto
  • 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;
  • 14. Anatomia di un VSPackage 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 • 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"
  • 23. Complichiamoci la vita: un custom ProjectSystem IL PROJECT.SYSTEM
  • 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;
  • 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 • 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;
  • 36. Editor: DesignSurface • ComponentDesigner; • IRootDesigner; • “Hosta” il controllo Windows Form – UserControl e Form sono IRootDesigner;
  • 38. Toolbox perchè sei tu Toolbox... LA TOOLBOX
  • 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
  • 45. I problemi principali che 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 sul pianista.... DOMANDE?
  • 49. Grazie a tutti, mi raccomando... IL MODULO DI FEEDBACK