如何调试Visual Studio扩展程序

105

我正在为Visual Studio 2010编写VSIX扩展程序,但无法确定如何进行调试。

一个明显的方法是输出信息。扩展模板使用Trace.WriteLine()。但在哪里找到它的输出呢?

4个回答

196

Visual Studio扩展可以像其他应用程序一样进行调试。您只需要设置调试体验来启动已加载扩展的devenv即可。请尝试以下步骤:

  • 右键单击项目,选择属性
  • 转到“调试”选项卡

单击“启动外部程序”单选按钮,将其指向devenv.exe二进制文件,例如在我的计算机上位于:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe

但是,在非x64计算机上,您可以删除“(x86)”部分。

然后,将命令行参数设置为/rootsuffix Exp。这将告诉Visual Studio使用实验性注册表而不是正常配置注册表。默认情况下,构建VSIX扩展时会将其自己注册在实验性注册表中。

现在,您可以按F5启动Visual Studio,并使用您的VSIX作为可用扩展程序。


@JaredPar - 有没有办法告诉vs2012扩展在vs2015预览版的实验性环境中注册自己? - Srikanth Venugopalan
1
看起来只有在调试和测试使用的版本相同时才有效。因此,您不能在2013年调试并在2015年运行扩展。@SrikanthVenugopalan - Maria Ines Parnisari
@miparnisari - 是的,看起来是这样。但如果您支持多个版本,这有点麻烦。 - Srikanth Venugopalan
谢谢。不知何故,我的配置文件中丢失了“/rootsuffix Exp”,什么都无法正常工作。 - Violet Giraffe
2
你好,你的意思是说它会将我的VSIX作为“可用扩展”启动VS吗?我在哪里可以找到可用的扩展?当我进入“工具”->“扩展和更新”时,我只看到“已安装”,“在线”和“更新”。 - pabrams

61

@JaredPar的答案在技术上是正确的,但存在一个问题,即您需要为每个开发人员重新执行此过程,每次获取代码的新副本以及每次删除csproj.user文件时都需要重新执行。这样做的话,设置将保存在csproj.user文件中。

更好的选择是将设置放在csproj文件中,以便不会丢失。不幸的是,Visual Studio不允许您自动执行此操作,因此您需要手动添加设置。幸运的是,任何项目的设置都是相同的。

右键单击卸载项目,然后再次右键单击并编辑csproj项目文件。在XML中,在第一个PropertyGroup之后(例如在TargetFramework之后),添加以下内容:

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

这样做有以下优点:

  • 它可以设置调试和发布
  • 它可以运行你当前正在运行的任何版本的Visual Studio
  • 它被纳入源代码控制,因此每个开发者都不必记住如何做 :)

正如@MBulli在评论中所述,如果你已经按照被接受的答案进行了更改,请删除你的*.csproj.user文件,因为其中的设置将覆盖你添加到主要的csproj文件中的设置。


6
请务必删除 *.csproj.user 文件,因为用户设置优先于项目设置。 - MBulli
在 VS 2019 中完美运行。 - x0n

2

OutputWindowHelper.OutputString方法可将信息输出到“通用”输出窗格(Ctrl Alt o)。我在我的.csproj引用中添加了此行以在VS 2013中获取此功能。

<Reference Include="Microsoft.VisualStudio.Services.Integration, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

还可以查看此答案


请注意,OutputWindowHelper在Visual Studio 2015中不存在。如果调用此函数,则仅安装了VS2015的计算机将抛出错误。另请参阅https://github.com/landofjoe/NuspecPackager/issues/1。 - Quango

0

如果您尝试调试 UnitTestExtension,您还应该像 这里 描述的那样将调试器附加到 vstest.*.exe 进程。否则,您可能会看到激活断点,但调试器永远不会命中它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接