Design de subtipos de projeto

Os subtipos de projeto permitem que os VSPackages estendam projetos com base no Microsoft Build Engine (MSBuild). O uso da agregação permite que você reutilize a maior parte do sistema de projeto gerenciado principal implementado no Visual Studio, mas ainda personalize o comportamento para um cenário específico.

Os tópicos a seguir detalham o design básico e a implementação de subtipos de projeto:

  • Projeto de Subtipo de Projeto.

  • Agregação multinível.

  • Interfaces de suporte.

Design do subtipo do projeto

A inicialização de um subtipo de projeto é obtida agregando o principal IVsHierarchy e IVsProject os objetos. Essa agregação permite que um subtipo de projeto substitua ou aprimore a maioria dos recursos do projeto base. Os subtipos de projeto têm a primeira chance de manipular propriedades usando , comandos usando e , e gerenciamento de item de projeto usando IVsHierarchyIOleCommandTarget IVsProject3.IVsUIHierarchy Os subtipos de projeto também podem estender:

  • Objetos de configuração do projeto.

  • Objetos dependentes da configuração.

  • Objetos de navegação independentes de configuração.

  • Objetos de automação de projetos.

  • Coleções de propriedades de automação de projetos.

Para obter mais informações sobre extensibilidade por subtipos de projeto, consulte Propriedades e métodos estendidos por subtipos de projeto.

Arquivos de Política

O ambiente do Visual Studio fornece um exemplo de extensão do sistema de projeto base com um subtipo de projeto em sua implementação de arquivos de diretiva. Um arquivo de política permite a modelagem do ambiente do Visual Studio gerenciando recursos que incluem o Gerenciador de Soluções, a caixa de diálogo Adicionar Projeto, a caixa de diálogo Adicionar Novo Item e a caixa de diálogo Propriedades. O subtipo de política substitui e aprimora esses recursos por meio de IVsFilterAddProjectItemDlgimplementações e IVsUIHierarchy implementaçõesIOleCommandTarget.

Mecanismo de Agregação

O mecanismo de agregação de subtipos de projeto do ambiente oferece suporte a vários níveis de agregação, permitindo assim que um subtipo avançado seja implementado por meio de um projeto com sabor. Além disso, os objetos de suporte de um subtipo de projeto, como IVsProjectFlavorCfg, são projetados para permitir vários níveis de camadas. De acordo com as restrições das regras de agregação COM e COM, os subtipos de projeto e os projetos de base precisam ser programados cooperativamente para permitir que o subtipo interno ou o projeto de base participem adequadamente na delegação de chamadas de método e no gerenciamento de contagens de referência. Ou seja, o projeto prestes a ser agregado tem que ser programado para apoiar a agregação.

A ilustração a seguir mostra uma representação esquemática de uma agregação de subtipo de projeto de vários níveis.

Visual Studio multilevel projectflavor graphic

Uma agregação de subtipo de projeto de vários níveis consiste em três níveis, um projeto base, que é agregado por um subtipo de projeto e, em seguida, agregado por um subtipo de projeto avançado. A figura se concentra em algumas das interfaces de suporte que são fornecidas como parte da arquitetura de subtipo de projeto do Visual Studio.

Mecanismos de implantação

Entre muitas das funcionalidades do sistema de projeto base aprimoradas por um subtipo de projeto estão os mecanismos de implantação. Um subtipo de projeto influencia os mecanismos de implantação implementando interfaces de configuração (como IVsDeployableProjectCfg e IVsBuildableProjectCfg) que são recuperadas chamando QueryInterface no IVsProjectCfgProvider. Em um cenário em que o subtipo de projeto e o subtipo de projeto avançado adicionam implementações de configuração diferentes, o projeto base chama QueryInterface o subtipo de IUnknownprojeto avançado . Se o subtipo de projeto interno contiver a implementação de configuração que o projeto base está solicitando, o subtipo de projeto avançado delegará à implementação fornecida pelo subtipo de projeto interno. Como um mecanismo para persistir o estado de um nível de agregação para outro, todos os níveis de subtipos de projeto são implementados IPersistXMLFragment para persistir dados XML não relacionados à compilação nos arquivos de projeto. Para obter mais informações, consulte Persistindo dados no arquivo de projeto MSBuild. IInternalExtenderProvider é implementado como um mecanismo para recuperar extensores de automação dos subtipos de projeto.

A ilustração a seguir se concentra na implementação do extensor de automação, o objeto de navegação de configuração do projeto em particular, usado pelos subtipos do projeto para estender o sistema de projeto base.

VS Project Flavor Auto Extender graphic

Os subtipos de projeto podem estender ainda mais o sistema de projeto base estendendo o modelo de objeto de automação. Eles são definidos como parte do objeto de automação DTE e são usados para estender o objeto Project, o objeto e o ProjectItem Configuration objeto. Para obter mais informações, consulte Estendendo o modelo de objeto do projeto base.

Agregação multinível

Uma implementação de subtipo de projeto que envolve um subtipo de projeto de nível inferior precisa ser programada cooperativamente para permitir que o subtipo de projeto interno funcione corretamente. Uma lista de responsabilidades de programação inclui:

  • A IPersistXMLFragment implementação do subtipo de projeto que está encapsulando o subtipo interno deve delegar à IPersistXMLFragment implementação do subtipo de projeto interno para ambos e Load Save métodos.

  • A IInternalExtenderProvider implementação do subtipo de projeto wrapper deve delegar à de seu subtipo de projeto interno. Em particular, a implementação de precisa obter a cadeia de caracteres de nomes do subtipo de projeto interno e, em seguida, concatenar as cadeias de GetExtenderNames caracteres que deseja adicionar como extensores.

  • A IVsProjectCfgProvider implementação de um subtipo de projeto wrapper deve instanciar o objeto de seu subtipo de projeto interno e mantê-lo como um delegado privado, uma vez que somente o objeto de configuração de projeto do projeto base sabe diretamente que o IVsProjectFlavorCfg objeto de configuração do subtipo de projeto wrapper existe. O subtipo de projeto externo pode inicialmente escolher as interfaces de configuração que deseja manipular diretamente e, em seguida, delegar o restante à implementação do get_CfgType.

Interfaces de suporte

O projeto base delega chamadas para interfaces de suporte adicionadas por um subtipo de projeto, para estender vários aspectos de sua implementação. Isso inclui estender objetos de configuração de projeto e vários objetos de navegador de propriedades. Essas interfaces são recuperadas chamando QueryInterface punkOuter (um ponteiro para o IUnknown) do agregador de subtipo de projeto mais externo.

Interface Subtipo de projeto
IVsProjectFlavorCfg Permite que o subtipo de projeto:

- Fornecer uma implementação de IVsDeployableProjectCfg.
- Controlar o lançamento do depurador, permitindo que o subtipo do projeto forneça sua própria implementação do IVsDebuggableProjectCfg.
- Desativar a avaliação de expressão em tempo de design, tratando adequadamente o DBGLAUNCH_DesignTimeExprEval caso em sua implementação do QueryDebugLaunch.
IInternalExtenderProvider Permite que o subtipo de projeto:

- Estender o VSHPROPID_BrowseObject do projeto para adicionar ou remover propriedades independentes de configuração do projeto.
- Estender o objeto de automação do projeto (VSHPROPID_ExtObject) do projeto.

Os valores de propriedade acima são retirados da __VSHPROPID2 enumeração.
IVsCfgBrowseObject Permite que o subtipo do projeto mapeie de volta para o objeto dado o IVsCfg objeto de navegação de configuração do projeto.
IVsBrowseObject Permite que o subtipo do projeto mapeie de volta para o ou o objeto, dado o IVsHierarchy VSITEMID objeto de navegação de configuração do projeto.
IPersistXMLFragment Permite que o subtipo de projeto persista dados estruturados XML arbitrários para o arquivo de projeto (.vbproj ou .csproj). Esses dados não são visíveis para o MSBuild.
IVsBuildPropertyStorage Permite que o subtipo de projeto:

- Adicione novas propriedades do MSBuild a serem persistentes.
- Remover propriedades desnecessárias do MSBuild.
- Consulta para um valor atual de uma propriedade MSBuild.
- Alterar o valor atual de uma propriedade MSBuild.

Confira também