如何:修改项目系统,以便项目在 Visual Studio 的多个版本加载

在 Visual Studio 2012,可以防止在您的填充的自定义项目系统创建在 Visual Studio 早期版本的项目,也可以使它标识自己到更高版本,以防它需要修复、转换或弃用。

备注

在此上下文中,修改项目的术语 修复 这意味着,以使它在最新版本或中创建的 Visual Studio 版本可以自动填充。转换或 升级,这意味着修改项目,使其在中创建的版本中可能不再加载。

标记项为不兼容

可以标记项为不符合 Visual Studio 的早期版本。 例如,假定您在 Visual Studio 2012 创建一个使用 .NET framework 5 功能的项目。 由于此项目在 Visual Studio 无法生成 2010 SP1,则可以将其标记为不符合 Visual Studio 2010 SP1,以便该版本不会尝试加载它。

将不兼容功能的组件对标记该项目负责为不兼容。 元素必须具有对表示项目相关的 IVsHierarchy 接口的。

标记项为不兼容

  1. 当 Visual Studio 标识该项目为不兼容时,它显示对话框请求权限标记任何特定项目的不兼容。 如果您授予项标记为不兼容, AskForUserConsentToBreakAssetCompat 返回 S_OK 到元素;否则,它将返回 OLE_E_PROMPTSAVECANCELLED。

    警告

    在大多数常见方案, IVsHierarchy 数组将只包含一个项目。

  2. 如果 AskForUserConsentToBreakAssetCompat 返回 S_OK,组件要执行或接受中断兼容性的更改。

重要

您必须实现 VSHPROPID_MinimumDesignTimeCompatVersion 属性标记项目的兼容或不兼容。例如,因此,如果项目系统使用 MSBuild 项目文件,向项目文件具有值等于对应的 VSHPROPID_MinimumDesignTimeCompatVersion 属性值的一个 <MinimumVisualStudioVersion> 生成属性。

检测项目是否不兼容的

使用 Visual Studio 的当前版本不兼容的项目必须从加载保留。 此外,不兼容的项目无法升级或修复。 因此,必须两次签出项兼容性:首先,那么,当为升级或修复考虑和接下来,中,然后才能加载。

若要启用项目不兼容的检测,则必须执行 UpgradeProject_CheckOnlyCreateProject 方法。 如果项目不兼容的, UpgradeProject_CheckOnly 必须返回成功代码 VS_S_INCOMPATIBLEPROJECT ,并 CreateProject 必须返回错误代码 VS_E_INCOMPATIBLEPROJECT。

备注

使用 UpgradeProject_CheckOnly 方法可以缓存兼容性检查的结果,使其可以由还使用的后续调用 CreateProject。

例如,因此,如果为 Visual Studio 2010 SP1 项目系统编写的 UpgradeProject_CheckOnly 和 CreateProject 方法检查一个项目文件并发现 <MinimumVisualStudioVersion> 生成属性是 “11.0”, Visual Studio 2010 SP1 不会加载项。 此外, 解决方案导航 指示该项目为 “不兼容的”并且不会加载它。

升级或修复项目

Visual Studio 2010 SP1 能将在 Visual Studio 早期版本创建的大多数项目。 不仅 Visual Studio 2012 执行此操作,它还可以更改在早期版本中创建的某些类型的项目,以便可以在任何一个版本加载。

在加载项目之前, Visual Studio 会调用 UpgradeProject_CheckOnly 方法来确定该项是否可升级。 如果项目可升级, UpgradeProject_CheckOnly 方法将导致稍后对 UpgradeProject 方法升级项目的标志。 由于不兼容的项目不能升级, UpgradeProject_CheckOnly 必须首先检查项目兼容性,如一前面的章节所述。

在 Visual Studio 2012,可以实现 UpgradeProject_CheckOnly 确定项目是否能修复,在加载之前。 如果项目中修复, UpgradeProject_CheckOnly 应返回成功代码 VS_S_PROJECTREPAIRONLYUPGRADEREQUIRED。 可能的升级要求在 VSPUVF_REPAIRFLAGS枚举,因此,它们包含以下可能性:

  1. SPUVF_PROJECT_NOREPAIR:不需要修复。

  2. VSPUVF_PROJECT_SAFEREPAIR:使该项目使用 Visual Studio 兼容 2010 中,没有问题可能具有该产品的早期版本的到达。

  3. VSPUVF_PROJECT_UNSAFEREPAIR:使该项目使用 Visual Studio 兼容 2010 中,但与某种风险的问题可能会遇到该产品的早期版本。 例如,因此,如果它依赖于在 Visual Studio 2012 之间的不同 SDK 版本和 Visual Studio 2010 中,项目将不兼容。

  4. VSPUVF_PROJECT_ONEWAYUPGRADE:使该项目不符合 Visual Studio 2010。

  5. VSPUVF_PROJECT_INCOMPATIBLE:指示 Visual Studio 2012 不支持此项目。

  6. VSPUVF_PROJECT_DEPRECATED:指示此项目不再受支持。

如果项目系统中调味 (例如, Visual Basic 或 C# 项目系统有 web、 Office (vsto), Silverlight 和其他项目类型生成在它上面),这些项类似可以实现从 IVsProjectFlavorUpgradeViaFactory2 接口的功能 UpgradeProjectFlavor_CheckOnly 。 若要使此功能工作, IVsProjectUpgradeViaFactory4. UpgradeProject_CheckOnly 实现提到的早期需调用它。 (注意在 Visual Basic 或 C# 基项目已实现系统。) 此功能的效果使项目类似还确定项目的升级要求,除了内容外基本项目系统确定的。 兼容性对话框显示最严重两个要求。

对于托管实现,这两个接口可在 [Microsoft.VisualStudio.Shell.Interop.11.0.dll] 程序集。

如果必须升级或转换在解决方案中的项目, Visual Studio 2012 与任何不兼容项目来列出它们在对话框中,。 如果选择将建议的更改, UpgradeProject 方法调用,并且,升级和修复已执行。 UpgradeProject 方法确定它所做的更改是否会阻止项目在 Visual Studio 早期版本的加载,并且,如果是这样,指示项目为不兼容。 例如,可以在 Visual Studio 中创建项目、 2010 SP1 GDR 然后打开在 Visual Studio 2012的该项目。 如果升级或修复可能,对话框显示请求允许进行更改。 如果您授予,修改项目并加载。如果您关闭解决方案然后重新打开它在使用 SP1 的 Visual Studio 2010 中,升级的项目将被视为不兼容,因此,已修复的项目正确加载。