如何在 VS 中调试 VSIX 扩展,该扩展是其他版本,然后是正在使用的 VS SDK 版本

How to debug VSIX extension in VS which is of other version then version of VS SDK being used

我的 Visual Studio 扩展有一个解决方案。此扩展应该适用于 VS2010 之后的任何 VS 版本。那是因为我使用 VS 2010 SDK。我做了 hack 以将我的项目绑定到 VS2010 SDK 程序集和目标,以便在没有安装 SDK 的情况下工作 - 感谢 this detailed guide by Aaron Marten。 我可以成功构建我的扩展的 vsix 并将其安装在任何 VS 中。不错

但我也想用 F5 调试我的扩展程序。我不想在 VS2010 中这样做,而是在其他一些 VS - VS 2015 中这样做。我什至安装了 VS 2015 SDK。但显然行不通。作为 VS2010 SDK 的目标,应该部署正在构建到 VS2010 实验实例中的扩展。

所以问题是:
如果扩展本身使用 VS2010 SDK,如何设置项目以在 VS2015 中使用 F5 调试 vsix 扩展

可能我需要使用 VS2015 SDK 中的一些 targets/tasks,但是哪些以及如何使用?

有关如何实现此目的的分步说明可在此处的提交历史记录中找到:https://github.com/jaredpar/RoundTripVSIX/commits/master(我在我的 VS 扩展中成功使用了它 "SQL Server Compact Toolbox")

为了简单起见,我把解决方案放在这里。它取自 https://github.com/jaredpar/RoundTripVSIX/commits/master - 请参阅@ErikEj 的回答并添加少量内容。

通常我们将 Microsoft.VsSDK.targets 文件导入到我们的 VS 包项目的 csproj 中。因为我的项目不依赖于全局安装的 VS SDK,所以我使用 VS2010 SDK 从本地文件夹导入:

<Import Project="..\..\SDK\v10.0\MSBuild\VSSDK\Microsoft.VsSDK.targets" />

诀窍是使这个导入动态:

  • 当我们在 VS 中时,应该导入 当前 VS 版本
  • 的 VSSDK 目标
  • 当我们构建项目时,应该导入最小支持的 VS 版本(像以前一样)的 VSSDK 目标。

这是通过附加变量实现的("VsSdkTargets" - 名称可以是任何名称):

<Import Condition="Exists($(VsSdkTargets))" Project="$(VsSdkTargets)" />

这里是 VsSdkTargets 的定义(应该在导入之前):

<PropertyGroup>
  <VsSdkTargets Condition=" '$(VisualStudioVersion)' == '' or '$(BuildingInsideVisualStudio)' != 'false' ">..\..\SDK\v10.0\MSBuild\VSSDK\Microsoft.VsSDK.targets</VsSdkTargets>
  <VsSdkTargets Condition=" '$(BuildingInsideVisualStudio)' == 'true' ">$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\VSSDK\Microsoft.VsSDK.targets</VsSdkTargets>

</PropertyGroup>

这使得我们的导入动态基于变量 VisualStudioVersion 的可用性,它仅在 VSBuildingInsideVisualStudio 中可用。 BuildingInsideVisualStudio 在 VS 中构建时将是 true

如果您需要在不同的 VS 版本中打开解决方案,那么我们还需要添加自定义 MinimumVisualStudioVersion 变量

<PropertyGroup>
  <!-- This is added to prevent forced migrations in Visual Studio 2012 and newer -->
  <MinimumVisualStudioVersion Condition="'$(VisualStudioVersion)' != ''">$(VisualStudioVersion)</MinimumVisualStudioVersion>
</PropertyGroup>

为了在所有支持的 Visual Studio 版本中以直接方式 (F5) 开始调试并且独立于项目的用户设置,您应该将以下说明附加到第一个 PropertyGroup:

<PropertyGroup>
  ...
  <StartAction>Program</StartAction>
  <StartProgram>$(DevEnvDir)\devenv.exe</StartProgram>
  <StartArguments>/rootsuffix Exp</StartArguments>
</PropertyGroup>