项目子类型设计

项目子类型允许 VSPackage 基于Microsoft 生成引擎(MSBuild)扩展项目。 使用聚合可以重用 Visual Studio 中实现的核心托管项目系统的大部分,但仍自定义特定方案的行为。

以下主题详细介绍了项目子类型的基本设计和实现:

  • 项目子类型设计。

  • 多级聚合。

  • 支持接口。

项目子类型设计

通过聚合主 IVsHierarchy 类型和 IVsProject 对象来实现项目子类型的初始化。 此聚合使项目子类型能够替代或增强基本项目的大多数功能。 项目子类型第一次有机会使用 IVsHierarchy、命令使用 IOleCommandTargetIVsUIHierarchy项目项管理 IVsProject3来处理属性。 项目子类型还可以扩展:

  • 项目配置对象。

  • 与配置相关的对象。

  • 与配置无关的浏览对象。

  • 项目自动化对象。

  • 项目自动化属性集合。

有关项目子类型扩展性的详细信息,请参阅 “属性”和“方法由项目子类型扩展”。

策略文件

Visual Studio 环境提供了一个示例,演示如何在其策略文件的实现中使用项目子类型扩展基本项目系统。 策略文件允许通过管理包括“解决方案资源管理器”、“添加项目”对话框、“添加新项”对话框和“属性”对话框在内的功能来塑造 Visual Studio 环境。 策略子类型通过实现替代和IVsUIHierarchy增强这些功能。IVsFilterAddProjectItemDlgIOleCommandTarget

聚合机制

环境的项目子类型聚合机制支持多个级别的聚合,从而允许通过进一步对风格化项目实现高级子类型。 此外,项目子类型的支持对象(例如 IVsProjectFlavorCfg)旨在允许多个级别的分层。 根据 COM 和 COM 聚合规则的约束,需要协作对项目子类型和基本项目进行编程,使内部子类型或基本项目能够正确参与委托方法调用和管理引用计数。 也就是说,必须对即将聚合的项目进行编程以支持聚合。

下图显示了多级项目子类型聚合的示意图表示形式。

Visual Studio multilevel projectflavor graphic

多级项目子类型聚合由三个级别组成,一个基本项目,由项目子类型聚合,然后由高级项目子类型进一步聚合。 该图重点介绍作为 Visual Studio 项目子类型体系结构的一部分提供的一些支持接口。

部署机制

项目子类型增强的许多基本项目系统功能包括部署机制。 项目子类型通过实现通过调用 QueryInterface 来IVsProjectCfgProvider检索的配置接口(如IVsDeployableProjectCfgIVsBuildableProjectCfg)来影响部署机制。 在项目子类型和高级项目子类型添加不同的配置实现的情况下,基础项目调用 QueryInterface 高级项目子类型 IUnknown。 如果内部项目子类型包含基本项目请求的配置实现,则高级项目子类型将委托给内部项目子类型提供的实现。 作为将状态从一个聚合级别保存到另一个聚合级别的机制,项目子类型的所有级别都实现 IPersistXMLFragment 以将非生成相关的 XML 数据保存到项目文件中。 有关详细信息,请参阅 MSBuild 项目文件中持久保存数据。 IInternalExtenderProvider 作为从项目子类型检索自动化扩展程序的机制实现。

下图重点介绍自动化扩展程序实现,即项目配置浏览对象,特别是项目子类型用于扩展基本项目系统。

VS Project Flavor Auto Extender graphic

项目子类型可以通过扩展自动化对象模型来进一步扩展基本项目系统。 这些定义是 DTE 自动化对象的一部分,用于扩展 Project 对象、 ProjectItem 对象和 Configuration 对象。 有关详细信息, 请参阅扩展基本项目的对象模型。

多级聚合

需要协作对包装较低级别的项目子类型的项目子类型实现进行编程,以允许内部项目子类型正常运行。 编程职责列表包括:

  • 包装 IPersistXMLFragment 内部子类型的项目子类型的实现必须委托给 IPersistXMLFragment 内部 Load 项目子类型的实现以及 Save 方法。

  • IInternalExtenderProvider包装项目子类型的实现必须委托给其内部项目子类型。 具体而言,实现 GetExtenderNames 需要从内部项目子类型获取名称字符串,然后连接要添加为扩展器的字符串。

  • IVsProjectCfgProvider包装项目子类型的实现必须实例化IVsProjectFlavorCfg其内部项目子类型的对象并将其保存为专用委托,因为只有基本项目的项目配置对象直接知道包装项目子类型配置对象存在。 外部项目子类型最初可以选择要直接处理的配置接口,然后将其余项委托给内部项目子类型的实现 get_CfgType

支持接口

基础项目委托对项目子类型添加的支持接口的调用,以扩展其实现的各个方面。 这包括扩展项目配置对象和各种属性浏览器对象。 通过调用 QueryInterfacepunkOuter 最外层项目子类型聚合器的指针来 IUnknown检索这些接口。

接口 项目子类型
IVsProjectFlavorCfg 允许项目子类型:

- 提供 . 的 IVsDeployableProjectCfg实现。
- 通过允许项目子类型提供其自己的实现 IVsDebuggableProjectCfg来控制调试器的启动。
- 通过在设计时表达式的实现QueryDebugLaunch中适当处理DBGLAUNCH_DesignTimeExprEval事例来禁用设计时表达式计算。
IInternalExtenderProvider 允许项目子类型:

- 扩展 VSHPROPID_BrowseObject 项目以添加或删除项目的配置独立属性。
- 扩展项目的项目自动化对象(VSHPROPID_ExtObject)。

上述属性值取自 __VSHPROPID2 枚举。
IVsCfgBrowseObject 允许项目子类型映射到 IVsCfg 给定项目配置浏览对象的对象。
IVsBrowseObject 给定项目配置浏览对象,允许项目子类型映射回 IVsHierarchy 或对象 VSITEMID
IPersistXMLFragment 允许项目子类型将任意 XML 结构化数据保存到项目文件(.vbproj 或 .csproj)。 此数据对 MSBuild 不可见。
IVsBuildPropertyStorage 允许项目子类型:

- 添加新的 MSBuild 属性以持久保存。
- 从 MSBuild 中删除不必要的属性。
- 查询 MSBuild 属性的当前值。
- 更改 MSBuild 属性的当前值。

另请参阅