Diseño de subtipos de proyecto
Los subtipos de proyecto permiten que VSPackages extienda proyectos basados en microsoft Build Engine (MSBuild). El uso de la agregación permite reutilizar la mayor parte del sistema de proyectos administrados principal implementado en Visual Studio, pero todavía personaliza el comportamiento de un escenario determinado.
En los temas siguientes se detalla el diseño básico y la implementación de subtipos de proyecto:
Diseño de subtipo de proyecto.
Agregación de varios niveles.
Interfaces compatibles.
Diseño de subtipo de proyecto
La inicialización de un subtipo de proyecto se logra mediante la agregación de los objetos y IVsProject principalesIVsHierarchy. Esta agregación permite que un subtipo de proyecto invalide o mejore la mayoría de las funcionalidades del proyecto base. Los subtipos de proyecto obtienen la primera oportunidad de controlar las propiedades mediante IVsHierarchy, comandos mediante IOleCommandTarget y IVsUIHierarchy, y la administración de elementos de proyecto mediante IVsProject3. Los subtipos del proyecto también pueden extenderse:
Objetos de configuración del proyecto.
Objetos dependientes de la configuración.
Objetos de exploración independientes de la configuración.
Objetos de automatización de proyectos.
Colecciones de propiedades de automatización de proyectos.
Para obtener más información sobre la extensibilidad por subtipos de proyecto, vea Propiedades y métodos extendidos por subtipos de proyecto.
Archivos de directivas
El entorno de Visual Studio proporciona un ejemplo de extensión del sistema de proyectos base con un subtipo de proyecto en su implementación de archivos de directiva. Un archivo de directiva permite dar forma al entorno de Visual Studio mediante la administración de características que incluyen la Explorador de soluciones, el cuadro de diálogo Agregar proyecto, el cuadro de diálogo Agregar nuevo elemento y el cuadro de diálogo Propiedades. El subtipo de directiva invalida y mejora estas características a través IVsFilterAddProjectItemDlgde implementaciones de y IOleCommandTarget
IVsUIHierarchy .
Mecanismo de agregación
El mecanismo de agregación de subtipos del proyecto del entorno admite varios niveles de agregación, lo que permite implementar un subtipo avanzado con un sabor adicional a un proyecto con sabor. Además, los objetos auxiliares de un subtipo de proyecto, como IVsProjectFlavorCfg, están diseñados para permitir varios niveles de capas. Al mantener las restricciones de las reglas de agregación COM y COM, los subtipos de proyecto y los proyectos base deben programarse de forma cooperativa para permitir que el subtipo interno o el proyecto base participen correctamente en la delegación de llamadas de método y la administración de recuentos de referencias. Es decir, el proyecto a punto de agregarse debe programarse para admitir la agregación.
En la ilustración siguiente se muestra una representación esquemática de una agregación de subtipos de proyecto de varios niveles.
Una agregación de subtipos de proyecto de varios niveles consta de tres niveles, un proyecto base, que se agrega mediante un subtipo de proyecto y, a continuación, se agrega aún más mediante un subtipo de proyecto avanzado. La ilustración se centra en algunas de las interfaces auxiliares que se proporcionan como parte de la arquitectura de subtipos del proyecto de Visual Studio.
Mecanismos de implementación
Entre muchas de las funcionalidades del sistema de proyectos base mejoradas por un subtipo de proyecto se encuentran los mecanismos de implementación. Un subtipo de proyecto influye en los mecanismos de implementación mediante la implementación de interfaces de configuración (como IVsDeployableProjectCfg y IVsBuildableProjectCfg) que se recuperan llamando a QueryInterface en IVsProjectCfgProvider. En un escenario en el que el subtipo del proyecto y el subtipo de proyecto avanzado agregan diferentes implementaciones de configuración, el proyecto base llama QueryInterface
a en el subtipo de proyecto avanzado.IUnknown
Si el subtipo del proyecto interno contiene la implementación de configuración que solicita el proyecto base, el subtipo de proyecto avanzado delega a la implementación proporcionada por el subtipo de proyecto interno. Como mecanismo para conservar el estado de un nivel de agregación a otro, todos los niveles de subtipos de proyecto se implementan IPersistXMLFragment para conservar datos XML no relacionados con la compilación en los archivos del proyecto. Para obtener más información, vea Conservar datos en el archivo de proyecto de MSBuild. IInternalExtenderProvider se implementa como un mecanismo para recuperar extensores de automatización de los subtipos del proyecto.
La siguiente ilustración se centra en la implementación del extensor de automatización, el objeto de exploración de configuración del proyecto en particular, utilizado por subtipos de proyecto para ampliar el sistema de proyecto base.
Los subtipos de proyecto pueden ampliar aún más el sistema de proyectos base mediante la extensión del modelo de objetos de automatización. Se definen como parte del objeto de automatización de DTE y se usan para extender el objeto Project, el ProjectItem
objeto y el Configuration
objeto . Para obtener más información, vea Extender el modelo de objetos del proyecto base.
Agregación de varios niveles
Una implementación de subtipo de proyecto que encapsula un subtipo de proyecto de nivel inferior debe programarse de forma cooperativa para permitir que el subtipo interno del proyecto funcione correctamente. Una lista de responsabilidades de programación incluye:
La IPersistXMLFragment implementación del subtipo del proyecto que encapsula el subtipo interno debe delegarse en la IPersistXMLFragment implementación del subtipo de proyecto interno para ambos Load métodos y Save .
La IInternalExtenderProvider implementación del subtipo del proyecto contenedor debe delegarse en la del subtipo interno del proyecto. En concreto, la implementación de GetExtenderNames necesita obtener la cadena de nombres del subtipo del proyecto interno y, a continuación, concatenar las cadenas que desea agregar como extensores.
La IVsProjectCfgProvider implementación de un subtipo de proyecto contenedor debe crear una instancia del IVsProjectFlavorCfg objeto de su subtipo de proyecto interno y contenerlo como delegado privado, ya que solo el objeto de configuración del proyecto base sabe directamente que existe el objeto de configuración del subtipo del proyecto contenedor. El subtipo de proyecto externo puede elegir inicialmente interfaces de configuración que desea controlar directamente y, a continuación, delegar el resto en la implementación del subtipo de proyecto interno de get_CfgType.
Interfaces auxiliares
El proyecto base delega las llamadas a interfaces auxiliares agregadas por un subtipo de proyecto, para ampliar varios aspectos de su implementación. Esto incluye la extensión de objetos de configuración del proyecto y varios objetos del explorador de propiedades. Estas interfaces se recuperan llamando QueryInterface
a en punkOuter
(un puntero a ) IUnknown
del agregador de subtipos de proyecto externo.
Interfaz | Subtipo de proyecto |
---|---|
IVsProjectFlavorCfg | Permite que el subtipo del proyecto: - Proporcionar una implementación de IVsDeployableProjectCfg. - Controle el inicio del depurador al permitir que el subtipo del proyecto proporcione su propia implementación de IVsDebuggableProjectCfg. - Deshabilite la evaluación de expresiones en tiempo de diseño controlando adecuadamente el DBGLAUNCH_DesignTimeExprEval caso en su implementación de QueryDebugLaunch. |
IInternalExtenderProvider | Permite que el subtipo del proyecto: - Ampliar el VSHPROPID_BrowseObject del proyecto para agregar o quitar propiedades independientes de configuración del proyecto. - Ampliar el objeto de automatización del proyecto (VSHPROPID_ExtObject) del proyecto. Los valores de propiedad anteriores se toman de la __VSHPROPID2 enumeración. |
IVsCfgBrowseObject | Permite que el subtipo del proyecto vuelva a asignarse al IVsCfg objeto dado el objeto de exploración de configuración del proyecto. |
IVsBrowseObject | Permite que el subtipo del proyecto vuelva a asignarse al IVsHierarchy objeto o VSITEMID , dado el objeto browse de configuración del proyecto. |
IPersistXMLFragment | Permite que el subtipo del proyecto conserve datos estructurados XML arbitrarios en el archivo del proyecto (.vbproj o .csproj). Estos datos no son visibles para MSBuild. |
IVsBuildPropertyStorage | Permite que el subtipo del proyecto: - Agregar nuevas propiedades de MSBuild que se van a conservar. - Quitar propiedades innecesarias de MSBuild. - Consulta de un valor actual de una propiedad de MSBuild. : cambie el valor actual de una propiedad de MSBuild. |