如何:升级项目系统

如果更改信息在该产品之间的差异 Visual Studio 版本的项目文件仍然存在,则需要支持升级项目文件从旧到新版本。 若要支持升级允许您可以 Visual Studio 转换向导,实现 IVsProjectUpgradeViaFactory 接口。 此接口包含唯一的结构可用于复制升级。 ,该解决方案的一部分,打开升级该项目发生。 IVsProjectUpgradeViaFactory 接口由项目工厂实现或者至少应可获取从项目工厂。

使用 IVsProjectUpgrade 接口的早期框架还支持,但是,概念上升级项目系统中,在中打开项目的一部分。 因此 IVsProjectUpgrade 接口由 Visual Studio 环境调用,即使 IVsProjectUpgradeViaFactory 接口调用或实现。 此方法允许您使用 IVsProjectUpgradeViaFactory 实现升级的副本和项目部分,并将该工作的其余部分执行的就地 (可能在新位置)。 IVsProjectUpgrade 接口。

有关 IVsProjectUpgrade的示例实现,请参见 Visual Studio 扩展性示例

以下情况带有项目升级:

  • 如果文件与该项目可以支持是较新的布局,则必须返回指定的此错误。 它假定,该产品的早期版本 (例如, Visual Studio .NET 2003 中 (包括代码来检查版本。

  • 如果 PUVFF_SXSBACKUP 标志。 UpgradeProject 方法指定,升级实现为就地升级该项目的开始标记前面。

  • 如果 PUVFF_COPYBACKUP 标志。 UpgradeProject 方法指定,升级实现,在将升级。

  • 如果 UPF_SILENTMIGRATE 标志。 UpgradeProject 指定调用,则该环境提示用户升级项目文件作为就地升级,在打开后,该项目。 例如,该环境提示用户升级用户何时打开解决方案的旧版本。

  • 如果 UPF_SILENTMIGRATE 标志。 UpgradeProject 未指定调用,则必须提示用户升级项目文件。

    下面是示例升级提示消息:

    “项目 “%1 " 使用 Visual Studio 的早期版本创建的。 如果打开它与此版本的 Visual Studio,您可能无法打开它与 Visual Studio 的早期版本。 要继续和打开此项目?”

实现 IVsProjectUpgradeViaFactory

  1. 执行 IVsProjectUpgradeViaFactory 接口,特别是在项目工厂实现的 UpgradeProject 方法的方法或由项目工厂实现使实现可调用。

  2. 如果要执行就地升级为解决方案开始的部分,提供标志 PUVFF_SXSBACKUPUpgradeProject 实现的 VSPUVF_FLAGS 参数。

  3. 如果要执行就地升级为解决方案开始的部分,提供标志 PUVFF_COPYBACKUPUpgradeProject 实现的 VSPUVF_FLAGS 参数。

  4. 对两个步骤 2 和步骤 3,实际文件升级步骤,使用 IVsQueryEditQuerySave2,可以实现如下面的 “实现 IVsProjectUpgade”节中所述,也可以将物理文件升级到 IVsProjectUpgrade

  5. 使用 IVsUpgradeLogger 方法以升级使用 Visual Studio 迁移向导的用户的相关的消息。

  6. IVsFileUpgrade 接口用于实现任何作为项目升级的一部分,需要发生的文件升级。 此接口不是从 IVsProjectUpgradeViaFactory,调用,而是提供作为 framework 为是项目系统的一部分的升级文件,但是,主项目系统可能不直接了解。 例如,这种情况可能出现,如果编译器相关文件,并且属性不是该相同的开发团队处理处理项目系统的其余部分。

IVsProjectUpgrade 实现

如果项目系统仅实现 IVsProjectUpgrade ,它不能参与 Visual Studio 转换向导。 但是,因此,即使您实现 IVsProjectUpgradeViaFactory 接口,您仍可以将文件升级到 IVsProjectUpgrade 实现。

实现 IVsProjectUpgrade

  1. 当用户尝试打开项目时, UpgradeProject 方法由环境调用,在打开后该项,并且,在其他用户操作在项目之前可用于。 如果已经提示用户升级解决方案,则 UPF_SILENTMIGRATE 标志。 grfUpgradeFlags 参数传递。 使用 添加现有项目 命令,如果用户直接打开项目,例如,则 UPF_SILENTMIGRATE 标志未通过,并且该项目需要提示用户升级。

  2. 响应 UpgradeProject 调用,该项目必须计算项目文件是否升级。 如果该项不需要升级项目类型到新版本,则可能返回 S_OK 标志。

  3. 如果项目需要升级项目类型到新版本,则必须确定项目文件是否可调用 QueryEditFiles 方法并传入修改按 QEF_ReportOnly 的值 rgfQueryEdit 参数的。 该项目并需要执行以下操作:

  4. 如果 QueryEditFiles 在项目文件调用导致文件签出和要检索的最新版本,则该项目卸载并重新加载。 ,在项目的其他实例后, UpgradeProject 方法将调用。 在的第二个调用,项目文件中向磁盘写入;建议项目保存项目文件的副本与 .OLD 扩展的前一布局,使其必需的升级更改,然后保存项目文件在新格式。 同样,因此,如果升级的任何部分处理失败,该方法必须通过返回 VS_E_PROJECTMIGRATIONFAILED指示失败。 这在解决方案资源管理器使该项卸载。

    请务必明确在大小写的环境中发生了 QueryEditFiles 方法的调用完整的过程 (指定 ReportOnly 的值) 返回 QER_EditNotOKQER_ReadOnlyUnderScc 标志。

  5. 用户尝试打开项目文件。

  6. 该环境调用 CanCreateProject 实现。

  7. 如果 CanCreateProject 返回 true,则该环境调用 CanCreateProject 实现。

  8. 该环境调用 Load 实现打开文件并初始化项的对象,例如, Project1。

  9. 该环境调用 IVsProjectUpgrade::UpgradeProject 实现确定项目文件是否需要升级。

  10. 您调用 QueryEditFiles 然后按 QEF_ReportOnly 的值 rgfQueryEdit 参数的。

  11. 该环境返回 VSQueryEditResultQER_EditNotOK ,并 QER_ReadOnlyUnderScc 位在 VSQueryEditResultFlags设置。

  12. IVsProjectUpgrade 实现调用 IVsQueryEditQuerySave::QueryEditFiles (QEF_ForceEdit_NoPromptingQEF_DisallowInMemoryEdits)。

这称为可能导致检索的项目文件签出和最新版本的新副本,以及需要重新加载项目文件。 此时,两个步骤之一:

  • 如果您的处理拥有项目重新加载,则该环境调用 ReloadItem (VSITEMID_ROOT) 实现。 在收到此调用时,重新加载项目 (Project1) 的第一个实例并继续升级项目文件。 该环境了解您的处理拥有项目重新加载,则返回 GetProperty (VSHPROPID_HandlesOwnReload) true 。

  • 如果您的句柄不拥有项目重新加载,则返回 GetProperty (VSHPROPID_HandlesOwnReload) false 。 在这种情况下,在 QueryEditFiles(QEF_ForceEdit_NoPromptingQEF_DisallowInMemoryEdits之前,) 返回,该环境创建另一个新的,该项目的实例,例如, Project2,如下所示:

    1. 该环境调用第一项对象的 Close , Project1,从而将此对象处于非活动状态。

    2. 该环境调用 IVsProjectFactory::CreateProject 实现创建项目, Project2 的第二个实例。

    3. 该环境调用 IPersistFileFormat::Load 实现打开文件并初始化第二项的对象, Project2。

    4. 该环境调用 IVsProjectUpgrade::UpgradeProject 第二次以确定是否应升级项目的对象。 但是,这在新,秒,该项目的实例, Project2 调用。 这是解决方案中处于打开状态。

      备注

      在第一个项目, Project1,在非活动状态的实例,然后将必须从返回的 S_OK 第一次调用 UpgradeProject 实现。为 IVsProjectUpgrade::UpgradeProject的实现参见 Basic Project

    5. 您调用 QueryEditFiles 然后按 QEF_ReportOnly 的值 rgfQueryEdit 参数的。

    6. 该环境返回 QER_EditOK ,并升级能继续,因为项目文件进行编写。

如果您无法升级,则返回从 IVsProjectUpgrade::UpgradeProjectVS_E_PROJECTMIGRATIONFAILED 。 如果升级不是必需的或您选择不升级,将 IVsProjectUpgrade::UpgradeProject 调用为 no-op。 如果返回 VS_E_PROJECTMIGRATIONFAILED,占位符节点添加到项目的解决方案。

请参见

任务

如何:升级项目项

其他资源

Visual Studio Conversion Wizard

项目 (Visual Studio SDK)