Conception des sous-types de projetProject Subtypes Design

Les sous-types de projet permettent VSPackages d’étendre des projets basés sur Microsoft Build Engine (MSBuild).Project subtypes let VSPackages extend projects based on the Microsoft Build Engine (MSBuild). L’utilisation d’agrégation vous permet de réutiliser la majeure partie du système de projet de base managées implémentée dans Visual StudioVisual Studio toujours personnaliser le comportement pour un scénario particulier.The use of aggregation lets you reuse the bulk of the core managed project system implemented in Visual StudioVisual Studio yet still customize the behavior for a particular scenario.

Les rubriques suivantes décrivent la conception de base et l’implémentation de sous-types de projet :The following topics detail the basic design and implementation of project subtypes:

  • Conception du sous-type de projet.Project Subtype Design.

  • Agrégation de plusieurs niveaux.Multi-level Aggregation.

  • Prise en charge des Interfaces.Supporting Interfaces.

Conception de sous-type de projetProject Subtype Design

L’initialisation d’un sous-type de projet s’effectue en agrégeant les principaux IVsHierarchy et IVsProject objets.The initialization of a project subtype is achieved by aggregating the main IVsHierarchy and IVsProject objects. Cette agrégation permet un sous-type de projet substituer ou améliorer la plupart des fonctionnalités du projet de base.This aggregation enables a project subtype to override or enhance most of the capabilities of the base project. Les sous-types de projet obtenir la première occasion de gérer à l’aide des propriétés IVsHierarchy, à l’aide des commandes IOleCommandTarget et IVsUIHierarchyet la gestion de l’élément projet à l’aide IVsProject3.Project subtypes get the first chance to handle properties using IVsHierarchy, commands using IOleCommandTarget and IVsUIHierarchy, and project item management using IVsProject3. Les sous-types de projet peuvent également étendre :Project subtypes can also extend:

  • Objets de configuration de projet.Project configuration objects.

  • Objets dépend de la configuration.Configuration-dependent objects.

  • Indépendant de la configuration de parcourir les objets.Configuration-independent browse objects.

  • Objets automation de projet.Project automation objects.

  • Collections de propriétés automation de projet.Project automation property collections.

    Pour plus d’informations sur l’extensibilité aux sous-types de projet, consultez propriétés et méthodes étendues aux sous-types de projet.For more information on extensibility by project subtypes, see Properties and Methods Extended by Project Subtypes.

Fichiers de stratégiePolicy Files

Le Visual StudioVisual Studio environnement fournit un exemple d’extension du système de projet de base avec un sous-type de projet dans son implémentation de fichiers de stratégie.The Visual StudioVisual Studio environment provides an example of extending the base project system with a project subtype in its implementation of policy files. Un fichier de stratégie permet la mise en forme de la Visual StudioVisual Studio environnement grâce à la gestion des fonctionnalités qui incluent l’Explorateur de solutions, ajouter un projet boîte de dialogue, ajouter un nouvel élément boîte de dialogue et les Propriétés boîte de dialogue.A policy file allows the shaping of the Visual StudioVisual Studio environment by managing features that include the Solution Explorer, Add Project dialog box, Add New Item dialog box and the Properties dialog box. Le sous-type de stratégie remplace et améliore ces fonctionnalités via IVsFilterAddProjectItemDlg, IOleCommandTarget et IVsUIHierarchy implémentations.The policy subtype overrides and enhances these features through IVsFilterAddProjectItemDlg, IOleCommandTarget and IVsUIHierarchy implementations.

Mécanisme d’agrégationAggregation Mechanism

Mécanisme d’agrégation sous-type de projet de l’environnement prend en charge plusieurs niveaux d’agrégation, ce qui permet un sous-type avancé à être implémentées par AROMATISANT supplémentaire pour un projet de plusieurs versions.The environment's project subtype aggregation mechanism supports multiple levels of aggregation, thus allowing an advanced subtype to be implemented by further flavoring a flavored project. En outre, les objets de prise en charge d’un projet de sous-type, tel que IVsProjectFlavorCfg, sont conçus pour permettre à plusieurs niveaux de superposition.Also, the supporting objects of a project subtype, such as IVsProjectFlavorCfg, are designed to allow multiple levels of layering. Dans les contraintes de COM et COM règles d’agrégation, sous-types de projet et projets de base doivent être programmées de manière coopérative pour activer le sous-type interne ou le projet de base de participer correctement de déléguer des appels de méthode et la gestion des décomptes de références .In keeping with the constraints of COM and COM aggregation rules, project subtypes and base projects need to be programmed cooperatively to enable the inner subtype or the base project to properly participate in delegating method calls and managing reference counts. Autrement dit, le projet sur le point d’être agrégée doit être programmées pour prendre en charge d’agrégation.That is, the project about to be aggregated has to be programmed to support aggregation.

L’illustration suivante montre une représentation schématique d’une agrégation de sous-type de projet à plusieurs niveaux.The following illustration shows a schematic representation of a multi-level project subtype aggregation.

Graphique de projet à plusieurs niveaux Visual StudioVisual Studio multilevel projectflavor graphic
Sous-type de projet à plusieurs niveauxMultilevel Project Subtype

Une agrégation de sous-type de projet à plusieurs niveaux se compose de trois niveaux, un projet de base, qui est agrégée par un sous-type de projet, puis davantage agrégées par un sous-type avancées du projet.A multi-level project subtype aggregation consists of three levels, a base project, which is aggregated by a project subtype, then further aggregated by an advanced project subtype. La figure met l’accent sur certaines interfaces de prise en charge qui sont fournis dans le cadre de la Visual StudioVisual Studio architecture du sous-type de projet.The figure focuses on some of the supporting interfaces that are provided as a part of the Visual StudioVisual Studio project subtype architecture.

Mécanismes de déploiementDeployment Mechanisms

Parmi d’autres du système de projet de base de fonctionnalités améliorées grâce à un sous-type de projet sont des mécanismes de déploiement.Among many of the base project system functionalities enhanced by a project subtype are deployment mechanisms. Un sous-type de projet détermine les mécanismes de déploiement en implémentant des interfaces de configuration (tel que IVsDeployableProjectCfg et IVsBuildableProjectCfg) qui sont récupérées par l’appel QueryInterface sur IVsProjectCfgProvider.A project subtype influences deployment mechanisms by implementing configuration interfaces (such as IVsDeployableProjectCfg and IVsBuildableProjectCfg) that are retrieved by calling QueryInterface on IVsProjectCfgProvider. Dans un scénario où le sous-type de projet et le sous-type de projet avancé ajouter des implémentations de configuration différente, le projet de base appelle QueryInterface sur le sous-type de projet avancé IUnknown.In a scenario where both the project subtype and the advanced project subtype add different configuration implementations, the base project calls QueryInterface on the advanced project subtype's IUnknown. Si le sous-type de projet interne contient l’implémentation de configuration demandant le projet de base, le sous-type de projet avancé délègue à l’implémentation fournie par le sous-type de projet interne.If the inner project subtype contains the configuration implementation that the base project is asking for, the advanced project subtype delegates to the implementation provided by the inner project subtype. Comme un mécanisme pour rendre persistant l’état de niveau d’une agrégation vers un autre, tous les niveaux de sous-types de projet implémentent IPersistXMLFragment pour conserver la build non lié les données XML dans les fichiers de projet.As a mechanism to persist state from one aggregation level to another, all the levels of project subtypes implement IPersistXMLFragment to persist non-build related XML data into the project files. Pour plus d’informations, consultez persistance des données dans le fichier projet MSBuild.For more information, see Persisting Data in the MSBuild Project File. IInternalExtenderProvider est implémenté comme un mécanisme permettant de récupérer les sous-types de projet des extendeurs automation.IInternalExtenderProvider is implemented as a mechanism to retrieve automation extenders from the project subtypes.

L’illustration suivante met l’accent sur l’implémentation d’extendeur automation, l’objet configuration projet en particulier, utilisé par les sous-types de projet pour étendre le système de projet de base.The following illustration focuses on the automation extender implementation, the project configuration browse object in particular, used by project subtypes to extend the base project system.

Graphique d’extendeur automatique de la version projet VSVS Project Flavor Auto Extender graphic
Extendeur de Automation de sous-type de projet.Project Subtype Automation Extender.

Les sous-types de projet peuvent étendre davantage le système de projet de base en étendant le modèle objet automation.Project subtypes can further extend the base project system by extending the automation object model. Ceux-ci sont définies dans le cadre de l’objet automation DTE et sont utilisés pour étendre l’objet de projet, le ProjectItem objet et le Configuration objet.These are defined as a part of the DTE automation object and are used to extend the Project object, the ProjectItem object and the Configuration object. Pour plus d’informations, consultez extension du modèle d’objet du projet de Base de.For more information see, Extending the Object Model of the Base Project.

Agrégation de plusieurs niveauxMulti-level Aggregation

Une implémentation de sous-type de projet qui encapsule un sous-type de projet de niveau inférieur doit être programmées de manière coopérative pour autoriser le sous-type de projet interne fonctionner correctement.A project subtype implementation that wraps a lower level project subtype needs to be programmed cooperatively to allow the inner project subtype to function properly. Une liste des responsabilités de programmation comprend :A list of programming responsibilities includes:

  • Le IPersistXMLFragment mise en œuvre du sous-type de projet qui encapsule le sous-type interne doit déléguer à la IPersistXMLFragment mise en œuvre du sous-type de projet interne pour les deux Load et Save méthodes.The IPersistXMLFragment implementation of the project subtype that is wrapping the inner subtype must delegate to the IPersistXMLFragment implementation of the inner project subtype for both Load and Save methods.

  • Le IInternalExtenderProvider implémentation du sous-type de projet wrapper doit déléguer à celui de son sous-type de projet interne.The IInternalExtenderProvider implementation of the wrapper project subtype must delegate to that of its inner project subtype. En particulier, l’implémentation de GetExtenderNames doit obtenir la chaîne des noms à partir du sous-type de projet interne et puis concaténer les chaînes qu’il souhaite ajouter en tant qu’extensions.In particular, the implementation of GetExtenderNames needs to get the string of names from the inner project subtype and then concatenate the strings it wants to add as extenders.

  • Le IVsProjectCfgProvider implémentation d’un sous-type de projet wrapper doit instancier la IVsProjectFlavorCfg objet de son interne sous-type de projet et maintenez-le enfoncé comme un délégué privé, étant donné qu’uniquement l’objet de configuration de projet du projet de base sait directement que le wrapper objet de configuration de sous-type de projet existe.The IVsProjectCfgProvider implementation of a wrapper project subtype must instantiate the IVsProjectFlavorCfg object of its inner project subtype and hold it as a private delegate, since only the base project's project configuration object directly knows that the wrapper project subtype configuration object exists. Le sous-type de projet externe peut initialement choisissez il souhaite gérer directement des interfaces de configuration, puis de déléguer le reste à l’implémentation du sous-type de projet interne de get_CfgType.The outer project subtype can initially choose configuration interfaces it wants to handle directly, and then delegate the rest to the inner project subtype's implementation of get_CfgType.

Prise en charge des InterfacesSupporting Interfaces

Le projet de base délègue les appels à la prise en charge des interfaces ajoutées par un sous-type de projet, d’étendre les différents aspects de son implémentation.The base project delegates calls to supporting interfaces added by a project subtype, to extend various aspects of its implementation. Cela inclut l’extension des objets de configuration de projet et les différents objets de navigateur de propriété.This includes extending project configuration objects and various property browser objects. Ces interfaces sont récupérés en appelant QueryInterface sur punkOuter (un pointeur vers le IUnknown) de l’agrégation de sous-type de projet extérieur.These interfaces are retrieved by calling QueryInterface on punkOuter (a pointer to the IUnknown) of the outermost project subtype aggregator.

InterfaceInterface Sous-type de projetProject Subtype
IVsProjectFlavorCfg Permet le sous-type de projet pour :Allows the project subtype to:

-Fournir une implémentation de IVsDeployableProjectCfg.- Provide an implementation of IVsDeployableProjectCfg.
-Contrôler le lancement du débogueur en autorisant le sous-type de projet fournir sa propre implémentation de IVsDebuggableProjectCfg.- Control the launch of the debugger by allowing the project subtype to provide its own implementation of IVsDebuggableProjectCfg.
-Désactiver l’évaluation de l’expression au moment du design en gérant correctement le DBGLAUNCH_DesignTimeExprEval cas dans son implémentation de QueryDebugLaunch.- Disable design-time expression evaluation by appropriately handling the DBGLAUNCH_DesignTimeExprEval case in its implementation of QueryDebugLaunch.
IInternalExtenderProvider Permet le sous-type de projet pour :Allows the project subtype to:

-Permet d’étendre le __VSHPROPID du projet pour ajouter ou supprimer des propriétés indépendantes de configuration du projet.- Extend the __VSHPROPID of the project to add or remove configuration independent properties of the project.
-Extension de l’objet automation de projet (__VSHPROPID) du projet.- Extend the project automation object (__VSHPROPID) of the project.

Les valeurs de propriété ci-dessus sont tirées de __VSHPROPID2 énumération.Property values above are taken from __VSHPROPID2 enumeration.
IVsCfgBrowseObject Permet le sous-type de projet à mapper vers le IVsCfg objet en fonction de l’objet configuration projet.Allows the project subtype to map back to the IVsCfg object given the project configuration browse object.
IVsBrowseObject Permet le sous-type de projet à mapper vers le IVsHierarchy ou VSITEMID objet, en fonction de l’objet configuration projet.Allows the project subtype to map back to the IVsHierarchy or the VSITEMID object, given the project configuration browse object.
IPersistXMLFragment Permet le sous-type de projet rendre persistantes des données XML structurée arbitraires dans le fichier projet (.vbproj ou .csproj).Allows the project subtype to persist arbitrary XML structured data to the project file (.vbproj or .csproj). Ces données ne sont pas visibles à MSBuild.This data is not visible to MSBuild.
IVsBuildPropertyStorage Permet le sous-type de projet pour :Allows the project subtype to:

-Ajouter de nouvelles propriétés de MSBuild à rendre persistantes.- Add new MSBuild properties to be persisted.
-Supprimer les propriétés inutiles dans MSBuild.- Remove unnecessary properties from MSBuild.
-Requête pour une valeur actuelle d’une propriété de MSBuild.- Query for a current value of an MSBuild property.
-Modifier la valeur actuelle d’une propriété de MSBuild.- Change the current value of an MSBuild property.

Voir aussiSee Also

__VSPROPID
__VSPROPID2