为了简单起见,我将解决方案放在这里。它取自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 仅在VS内部可用和BuildingInsideVisualStudio。在 VS 中构建时,BuildingInsideVisualStudio 将是 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>