保留 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. pszPropName 设置为要删除的属性,然后调用 RemoveProperty

与构建无关的数据持久性在项目文件中通过IPersistXMLFragment进行管理。

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

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

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

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

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

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

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

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