Condividi tramite


Progettazione di sottotipi di progetto

I sottotipi di progetto consentono ai pacchetti VSPackage di estendere i progetti in base al motore di compilazione Microsoft (MSBuild). L'uso dell'aggregazione consente di riutilizzare la maggior parte del sistema di progetto gestito principale implementato in Visual Studio, ma ancora personalizzare il comportamento per uno scenario specifico.

Negli argomenti seguenti viene illustrata la progettazione e l'implementazione di base dei sottotipi di progetto:

  • Progettazione del sottotipo di progetto.

  • Aggregazione a più livelli.

  • Interfacce di supporto.

Progettazione sottotipo progetto

L'inizializzazione di un sottotipo di progetto viene ottenuta aggregando i principali IVsHierarchy oggetti e IVsProject . Questa aggregazione consente a un sottotipo di progetto di eseguire l'override o migliorare la maggior parte delle funzionalità del progetto di base. I sottotipi di progetto ottengono la prima possibilità di gestire le proprietà usando IVsHierarchyi comandi , usando IOleCommandTarget e IVsUIHierarchye la gestione degli elementi del progetto usando IVsProject3. I sottotipi di progetto possono anche estendersi:

  • Oggetti di configurazione del progetto.

  • Oggetti dipendenti dalla configurazione.

  • Oggetti di esplorazione indipendenti dalla configurazione.

  • Oggetti di automazione del progetto.

  • Raccolte di proprietà di automazione del progetto.

Per altre informazioni sull'estendibilità in base ai sottotipi di progetto, vedere Proprietà e metodi estesi dai sottotipi di progetto.

File dei criteri

L'ambiente di Visual Studio fornisce un esempio di estensione del sistema di progetto di base con un sottotipo di progetto nell'implementazione dei file di criteri. Un file di criteri consente di modellare l'ambiente di Visual Studio gestendo le funzionalità che includono la Esplora soluzioni, la finestra di dialogo Aggiungi progetto, la finestra di dialogo Aggiungi nuovo elemento e la finestra di dialogo Proprietà. Il sottotipo di criteri esegue l'override e migliora queste funzionalità tramite IVsFilterAddProjectItemDlgle implementazioni di IOleCommandTarget e IVsUIHierarchy .

Meccanismo di aggregazione

Il meccanismo di aggregazione del sottotipo di progetto dell'ambiente supporta più livelli di aggregazione, consentendo così l'implementazione di un sottotipo avanzato con un ulteriore sapore di un progetto. Inoltre, gli oggetti di supporto di un sottotipo di progetto, ad esempio IVsProjectFlavorCfg, sono progettati per consentire più livelli di suddivisione in livelli. In linea con i vincoli delle regole di aggregazione COM e COM, i sottotipi di progetto e i progetti di base devono essere programmati in modo cooperativo per consentire al sottotipo interno o al progetto di base di partecipare correttamente alle chiamate ai metodi e alla gestione dei conteggi dei riferimenti. Questo significa che il progetto che sta per essere aggregato deve essere programmato per supportare l'aggregazione.

La figura seguente mostra una rappresentazione schema di un'aggregazione di sottotipi di progetto multi-livello.

Visual Studio multilevel projectflavor graphic

Un'aggregazione di sottotipi di progetto multi-livello è costituita da tre livelli, un progetto di base, aggregato da un sottotipo di progetto, quindi ulteriormente aggregato da un sottotipo di progetto avanzato. La figura è incentrata su alcune delle interfacce di supporto fornite come parte dell'architettura del sottotipo di progetto di Visual Studio.

Meccanismi di distribuzione

Tra molte delle funzionalità di sistema di progetto di base migliorate da un sottotipo di progetto sono meccanismi di distribuzione. Un sottotipo di progetto influenza i meccanismi di distribuzione implementando interfacce di configurazione (ad esempio IVsDeployableProjectCfg e IVsBuildableProjectCfg) recuperate chiamando QueryInterface in IVsProjectCfgProvider. In uno scenario in cui sia il sottotipo di progetto che il sottotipo di progetto avanzato aggiungono implementazioni di configurazione diverse, il progetto di base chiama QueryInterface il sottotipo di progetto avanzato.IUnknown Se il sottotipo di progetto interno contiene l'implementazione di configurazione richiesta dal progetto di base, il sottotipo di progetto avanzato delega all'implementazione fornita dal sottotipo di progetto interno. Come meccanismo per rendere persistente lo stato da un livello di aggregazione a un altro, tutti i livelli dei sottotipi di progetto implementano IPersistXMLFragment per rendere persistenti i dati XML non correlati alla compilazione nei file di progetto. Per altre informazioni, vedere Rendere persistenti i dati nel file di progetto MSBuild. IInternalExtenderProvider viene implementato come meccanismo per recuperare gli extender di automazione dai sottotipi di progetto.

La figura seguente è incentrata sull'implementazione dell'extender di automazione, l'oggetto di esplorazione della configurazione del progetto, in particolare, usato dai sottotipi di progetto per estendere il sistema di progetto di base.

VS Project Flavor Auto Extender graphic

I sottotipi di progetto possono estendere ulteriormente il sistema di progetto di base estendendo il modello a oggetti di automazione. Questi vengono definiti come parte dell'oggetto di automazione DTE e vengono usati per estendere l'oggetto Project, l'oggetto ProjectItem e l'oggetto Configuration . Per altre informazioni, vedere Estensione del modello a oggetti del progetto di base.

Aggregazione a più livelli

Un'implementazione del sottotipo di progetto che esegue il wrapping di un sottotipo di progetto di livello inferiore deve essere programmata in modo cooperativo per consentire al sottotipo del progetto interno di funzionare correttamente. Un elenco delle responsabilità di programmazione include:

  • L'implementazione IPersistXMLFragment del sottotipo di progetto che esegue il wrapping del sottotipo interno deve delegare all'implementazione IPersistXMLFragment del sottotipo del progetto interno per entrambi Load i metodi e Save .

  • L'implementazione IInternalExtenderProvider del sottotipo di progetto wrapper deve delegare a quella del sottotipo di progetto interno. In particolare, l'implementazione di GetExtenderNames deve ottenere la stringa di nomi dal sottotipo del progetto interno e quindi concatenare le stringhe da aggiungere come extender.

  • L'implementazione IVsProjectCfgProvider di un sottotipo di progetto wrapper deve creare un'istanza dell'oggetto IVsProjectFlavorCfg del sottotipo di progetto interno e tenerla come delegato privato, poiché solo l'oggetto di configurazione del progetto di base sa direttamente che l'oggetto di configurazione del progetto wrapper sottotipo esiste. Il sottotipo di progetto esterno può inizialmente scegliere interfacce di configurazione che vuole gestire direttamente e quindi delegare il resto all'implementazione del sottotipo del progetto interno di get_CfgType.

Interfacce di supporto

Il progetto di base delega le chiamate alle interfacce di supporto aggiunte da un sottotipo di progetto, per estendere vari aspetti dell'implementazione. Sono inclusi l'estensione degli oggetti di configurazione del progetto e di vari oggetti visualizzatore di proprietà. Queste interfacce vengono recuperate chiamando QueryInterface ( punkOuter un puntatore a ) dell'aggregatore IUnknowndel sottotipo di progetto più esterno.

Interfaccia Sottotipo progetto
IVsProjectFlavorCfg Consente al sottotipo di progetto di:

- Specificare un'implementazione di IVsDeployableProjectCfg.
- Controllare l'avvio del debugger consentendo al sottotipo di progetto di fornire la propria implementazione di IVsDebuggableProjectCfg.
- Disabilitare la valutazione dell'espressione in fase di progettazione gestendo in modo appropriato il DBGLAUNCH_DesignTimeExprEval caso nell'implementazione di QueryDebugLaunch.
IInternalExtenderProvider Consente al sottotipo di progetto di:

- Estendere l'oggetto VSHPROPID_BrowseObject del progetto per aggiungere o rimuovere proprietà indipendenti dalla configurazione del progetto.
- Estendere l'oggetto di automazione del progetto (VSHPROPID_ExtObject) del progetto.

I valori delle proprietà precedenti vengono ricavati dall'enumerazione __VSHPROPID2 .
IVsCfgBrowseObject Consente al sottotipo di progetto di eseguire il mapping all'oggetto in base all'oggetto IVsCfg di esplorazione della configurazione del progetto.
IVsBrowseObject Consente al sottotipo di progetto di eseguire il mapping all'oggetto IVsHierarchy o , in base all'oggetto VSITEMID di esplorazione della configurazione del progetto.
IPersistXMLFragment Consente al sottotipo di progetto di rendere persistenti i dati strutturati XML arbitrari nel file di progetto (con estensione vbproj o csproj). Questi dati non sono visibili a MSBuild.
IVsBuildPropertyStorage Consente al sottotipo di progetto di:

- Aggiungere nuove proprietà di MSBuild da rendere persistenti.
- Rimuovere le proprietà non necessarie da MSBuild.
- Eseguire una query per un valore corrente di una proprietà MSBuild.
- Modificare il valore corrente di una proprietà MSBuild.

Vedi anche