1

我正在寻找可以帮助我启动自己的调试过程的 Visual Studio 插件。我想保持原始基于 F5 的调试完好无损,因此我不想拦截该调用并需要单独的 AddIn。

有什么建议么

4

1 回答 1

5

最简单的方法是使用插件捕获系统事件/宏。在这些事件中覆盖 vs 所做的事情真的很容易。使用标准 Visual Studio 命令(例如 F5)时,所有事件都会自动触发。这包括所有标准的 Visual Studio 快捷键、菜单和工具栏按钮。

创建一个新的 vs addin 项目,它会自动添加代码以附加 OnBeforeCommandEvent。在 vb 中,事件处理程序将如下面的代码所示。

Friend Sub OnBeforeCommandEvent(sGuid As String, ID As Integer, CustomIn As Object, CustomOut As Object, ByRef CancelDefault As Boolean)

该事件向您传递 sGuid 和 ID。您可以将这两项解析为宏字符串名称 (sCommandName),如下所示:-

 Dim objCommand As EnvDTE.Command

 Try
        objCommand = _applicationObject.Commands.Item(sGuid, ID)
 Catch ex As Exception
        'unknown guids can be ignored
        Exit Sub
 End Try

 If objCommand Is Nothing Then Exit Sub
        Dim sCommandName As String
        sCommandName = objCommand.Name

注意:插件启动时将_applicationObject传递给您的代码。一个新的插件项目将自动包含以下OnConnection事件代码,第一个参数_applicationObject如上所示。

OnConnection(ByVal application As Object

获得sCommandName变量后,它将包含 Visual Studio 宏的名称,例如Debug.Start.

要覆盖这些Debug.Start函数,您将添加一些自己的代码并记住在退出处理程序之前设置CancelDefault为。True

当您设置CancelDefault为 true 时,Visual Studio 将不会运行标准宏,这意味着您可以在按下 F5 时运行自己的调试器。

这些是在构建过程中使用的 Visual Studio 宏名称。您可以根据需要覆盖尽可能多或尽可能少的内容。我已将它们分组到它们的相关功能中,但您可以任意组合处理它们。

Select Case sCommandName

         Case "Debug.Start", _
                    "Debug.StartWithoutDebugging"
                    System.Windows.Forms.MessageBox.Show("You clicked F5, we are overriding the debug process")
                    CancelDefault=true
                    Exit Sub


         Case "ClassViewContextMenus.ClassViewProject.Rebuild", _
                    "ClassViewContextMenus.ClassViewProject.Build", _
                    "Build.RebuildOnlyProject", _
                    "Build.RebuildSelection", _
                    "Build.BuildOnlyProject", _
                    "Build.BuildSelection"

         Case "Build.RebuildSolution", _
                    "Build.BuildSolution"

         Case "ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance", _
                    "ClassViewContextMenus.ClassViewProject.Debug.StepIntonewinstance"

         Case "Build.CleanSelection", _
                    "Build.CleanSolution", _
                    "ClassViewContextMenus.ClassViewProject.Clean"

         Case "Build.SolutionConfigurations"
于 2012-09-08T17:23:02.083 回答