保留 MSBuild 项目文件中的数据

项目子类型可能需要将特定于子类型的数据保存到项目文件中供以后使用。 项目子类型使用项目文件持久性来满足以下要求:

  1. 保存用于生成项目的一部分的数据。 (有关Microsoft 生成引擎的详细信息,请参阅 MSBuild。与生成相关的信息可以是:

    1. 与配置无关的数据。 也就是说,数据存储在具有空白或缺失条件的 MSBuild 元素中。

    2. 依赖于配置的数据。 也就是说,存储在特定项目配置的 MSBuild 元素中的数据。 例如:

      <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
      
  2. 保留与生成无关的数据。 此数据可以用未根据 XML 架构验证的自由格式 XML 来表示。

    1. 与配置无关的数据。

    2. 依赖于配置的数据。

通过 MSBuild 处理可用于生成项目的数据持久性。 MSBuild 系统维护与生成相关的信息的主表。 项目子类型负责访问此数据以获取和设置属性值。 项目子类型还可以通过添加要持久保存的其他属性以及删除属性来增强生成相关的数据表,以便它们不会持久保存。

若要修改 MSBuild 数据,项目子类型负责通过基础项目系统 IVsBuildPropertyStorage检索 MSBuild 属性对象。 IVsBuildPropertyStorage 是在核心项目系统上实现的接口,通过运行 QueryInterface聚合项目子类型查询。

以下过程概述了使用 IVsBuildPropertyStorage..

从 MSBuild 项目文件中删除属性

  1. IVsBuildPropertyStorage对项目子类型进行调用QueryInterface

  2. 调用 RemoveProperty 设置为 pszPropName 要删除的属性。

处理不重要生成 IPersistXMLFragment的项目文件中数据的持久性。

可以在主project subtype aggregator对象、project subtype project configuration对象或两者上实现IPersistXMLFragment

以下几点概述了有关非生成相关信息持久性的主要概念。

  • 基本项目调用主项目子类型(即最外部项目子类型)聚合器对象来加载和保存独立于配置的数据,并调用项目子类型项目配置对象来加载或保存与配置相关的数据。

  • 基本项目针对每个级别的项目子类型聚合调用多次的方法 IPersistXMLFragment ,并传递每个级别的 GUID。

  • 基本项目传递或接收专用于特定项目子类型的 XML 片段,并将此机制用作聚合级别之间保持状态的方法。

  • 基本项目调用传入 GUID 的最外部项目子类型的 IPersistXMLFragment实现。 如果 GUID 属于最外部的项目子类型,则它处理调用本身;否则,它将委托对内部项目子类型的调用等,直到找到 GUID 对应的项目子类型。

  • 项目子类型还可以在将调用委托给内部项目子类型之前或之后修改 XML 片段。 以下示例显示了项目文件中的摘录,其中,包含特定于项目子类型的属性的文件的名称将传递给该项目子类型。

    <ProjectExtensions>
        <VisualStudio>
          <FlavorProperties GUID="{<FlavorGUID>}">
            <FlavorProject TestFileFolder="TestFile" />
          </FlavorProperties>
        </VisualStudio>
      </ProjectExtensions>