Resumé

Estendi Visual Studio 2005 con Custom Tools

Cristian Merighi () 0,00

Un progetto cui da tempo ero ingolosito, recentemente ho avuto l'occasione di mettermici e ora devo dire che la soddisfazione è notevole: creare un custom tool "Generatore di Codice" per Visual Studio 2005.
Questo articolo è da considerarsi obsoleto. Alcune funzionalità potrebbero non essere più disponibili e non è possibile aggiungere commenti.

Wow! ...no, non si tratta del motto di Vista, ma dell'"Extensibility" di Visual Studio!
Durante mia assidua ricerca della riutilizzabilità e della manutenibilità del codice, mi sono fermato un attimo a chiedermi come fosse possibile generarne una porzione a partire da un semplice file di configurazione (XML che soggiace ad un preciso schema). Giusto per rendere l'idea, alla maniera di quello che succede coi files di risorse (.resx) o coi Dataset strong typed (.xsd).

L'obbiettivo era stimolante - sono un neofita totale nell'ambito dell'estensibilità di Visual Studio, e per di più la documentazione in merito è piuttosto scarsa - così mi sono cimentato... only the braves!

Premesso il successone del tentativo :), non è mia intenzione proporre del codice in questo articolo, bensì fornire qualcosa di più importante: una lista ordinata delle operazioni da compiere per avere il proprio generatore di codice registrato ed utilizzabile in Visual Studio 2005.

  1. Prima di tutto. Creare un progetto tipo Class Library e aggiungere le seguenti references:
    • EnvDTE;
    • EnvDTE80
    • Microsoft.VisualStudio.OLE.Interop;
    • Microsoft.VisualStudio.Shell;
    • Microsoft.VisualStudio.Shell.Design;
    • Microsoft.VisualStudio.Shell.Interop;
    • Microsoft.VisualStudio.Shell.Interop.8.0;
    • VSLangProj;
    • VSLangProj2;
    • VSLangProj80.
  2. La classe generatrice di codice che si va a sviluppare deve implementare le seguenti interfacce:
    • Microsoft.VisualStudio.Shell.Interop.IVsSingleFileGenerator
    • Microsoft.VisualStudio.OLE.Interop.IObjectWithSite
    Questa potrebbe risultare un'operazione piuttosto dispendiosa ma, fortunatamente, si può fare affidamento sul Visual Studio SDK di Microsodt che porta con se la perla del progetto d'esempio "SingleFileGenerator. Si può utilizzare l'implementazione base che lì si trova.
  3. Una volta che il progetto è correttamente completato, non bisogna dimenticare di firmare l'assembly risultante con uno strong name dimodoché possa essere registrato nella global assembly cache (GAC).
    Utilizzate il tool sn.exe per questa operazione.
  4. Il tool gacutil.exe (utilizzabile via commandline) permette di registrare l'assembly nella GAC:
    c:\> gacutil /i e:\mypath_to_the_assembly\myassembly.dll
            
    gacutil.exe
  5. Ora si tratta di rendere visibile dai client COM il nostro assembly.
    Ho dimenticato di menzionare che è necessario contrassegnare la classe in oggetto con il System.Runtime.InteropServices.ComVisibleAttribute settato a true.
    Utilizzare il tool regasm.exe per la registrazione COM:
    c:\> regasm e:\mypath_to_the_assembly\myassembly.dll
            
    regasm.exe
  6. Ultimo, ma non ultimo, l'inserimento di alcune chiavi di registro relative a Visual Studio e alla sua sezione Generators:
    innanzitutto bisogna marcare con un attributo System.Runtime.InteropServices.GuidAttribute la classe (Guid random a scelta); A questo punto utilizzare lo stesso Guid, il nome scelto per il Custom Tool, ed il nome fully qualified dell'assembly nella GAC per scrivere il seguente .reg file:
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\CLSID\{1ee90719-1d96-4f16-b1cb-2abbb6fd2ac8}]
    @="Pacem.VisualStudio.Generators.AdaptxCodeGenerator"
    "InprocServer32"="C:\\WINDOWS\\system32\\mscoree.dll"
    "Class"="Pacem.VisualStudio.Generators.AdaptxCodeGenerator"
    "Assembly"="Pacem.VisualStudio, Version=1.0.0.0, Culture=neutral, PublicKeyToken=659a547d5fd6a604"
    "ThreadingModel"="Both"
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Generators\{164B10B9-B200-11D0-8C61-00A0C91E29D5}\AdaptxCodeGenerator]
    @="Pacem.Data.Adapters Class Generator"
    "CLSID"="{1ee90719-1d96-4f16-b1cb-2abbb6fd2ac8}"
    "GeneratesDesignTimeSource"=dword:00000001
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Generators\{E6FDF8B0-F3D1-11D4-8576-0002A516ECE8}\AdaptxCodeGenerator]
    @="Pacem.Data.Adapters Class Generator"
    "CLSID"="{1ee90719-1d96-4f16-b1cb-2abbb6fd2ac8}"
    "GeneratesDesignTimeSource"=dword:00000001
    
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Generators\{FAE04EC1-301F-11d3-BF4B-00C04F79EFBC}\AdaptxCodeGenerator]
    @="Pacem.Data.Adapters Class Generator"
    "CLSID"="{1ee90719-1d96-4f16-b1cb-2abbb6fd2ac8}"
    "GeneratesDesignTimeSource"=dword:00000001
            

...Et voila!
Buttate un occhio al seguente screenshot:

adaptx codegenerator

Take care. Bye.

feedback
 

Syndicate

Autore

Cristian Merighi facebook twitter google+ youtube

Ultimi articoli

Top rated

Archivio

Dove sono?

Autore

Cristian Merighi facebook twitter google+ youtube

Le mie letture

Feeds