在 Visual Studio 异常设置中是否有 enable/disable "Common Language Runtime Exceptions" 的键盘快捷键?

Is there a keyboard shortcut to enable/disable "Common Language Runtime Exceptions" in Visual Studio exception settings?

我发现自己经常启用和禁用异常设置中的 "Common Language Runtime Exceptions" 复选框。我厌倦了每次都必须打开 window。有快捷键吗?

编辑:截至 2020 年 6 月的答案似乎是 "no",我在这里请求了一个功能:https://developercommunity.visualstudio.com/idea/1073035/keyboard-shortcut-to-enabledisable-the-common-runt.html

Is there a keyboard shortcut to enable/disable “Common Language Runtime Exceptions” in Visual Studio exception settings?

我认为没有这么快捷的捷径。

其实,Exceptionwindow的快捷方式是Ctrl+Alt+E,你可以这样调用window。

但是,VS只有打开一个快捷键window,并没有启用或禁用异常的快捷键,而且有很多不同异常中的异常类型 window。所以可能有点难。

所以你应该使用快捷方式Ctrl+Alt+E打开异常然后手动设置异常。

除此之外,如果您仍然希望该功能具有 enable/disable 公共语言运行时异常 的键盘快捷键,您可以在我们的 User Voice Forum.

上建议此功能

之后,您可以在这里与我们分享link,任何对这个功能感兴趣的人都会投票给它,这样它会得到更多的关注微软.

它由 VSDebugCoreUI.dll 中的 DebuggerServiceHelper class 管理:

ExceptionSettingsBatchOperation{_operationDepth=3} DebuggerServiceHelper.BeginExceptionBatchOperation()
DebuggerServiceHelper.UpdateException(EXCEPTION_INFO150{bstrProgramName=null, bstrExceptionName="Common Language Runtime Exceptions", dwCode=0, dwState=16418})
ExceptionSettingsBatchOperation.EndBatchOperation()

但是这些都是内部的 classes 并且不容易从外部代码访问。

另一种方法是在屏幕上找到此 WPF CheckBox(通过带有给定文本 属性 的 TextBlock)并以编程方式单击它。

我真的希望 Exception Breaker 能为 Visual Studio 的更高版本工作。

结合这个 answer 到一个类似的问题,我能够得到一些工作。这并不理想,但您可以尝试一下。

注:我用的是Visual Studio2019

需要工具

  • Visual Commander 扩展的免费版本,允许在更高版本中使用 Visual Studio 宏。

注意:我尝试(稍微)使用 Macros for Visual Studio 扩展,但没有成功

步骤

  1. 使用 Visual Commander,使用以下代码添加一个新命令,保存并编译。
  2. 运行 具有以下之一:
  • 运行 直接来自 Visual Commander UI
  • 修改工具栏并向其添加Extensions/Command01命令
  • 通过选项和 select VCmd.Command01
  • 添加键盘快捷键

代码

备注:

  • 我尝试切换 <All Common Language Runtime Exceptions not in this list> 项目,但没有成功。
  • 我尝试遍历组中的所有异常,但它真的很慢(即 15 秒 :-( ) 所以我为我的项目选择了最重要的异常。
  • 我没有成功找到一个切换父级的方法Common Language Runtime Exceptions,但是如果你找到了,请发表评论。

using EnvDTE;
using EnvDTE80; // DTE2 type
using EnvDTE90; // Debugger3

public class M : VisualCommanderExt.ICommand
{
    public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) 
    {
        var lDebugger = DTE.Debugger as Debugger3;

        var lExceptionSettings = lDebugger.ExceptionGroups.Item("Common Language Runtime Exceptions");

        // Use this Exception as the master toggle
        bool lExceptionsEnabledToSet = !lExceptionSettings.Item("System.ArgumentException").BreakWhenThrown;

        // 2 examples
        lExceptionSettings.SetBreakWhenThrown(lExceptionsEnabledToSet, lExceptionSettings.Item("System.ArgumentException"));
        lExceptionSettings.SetBreakWhenThrown(lExceptionsEnabledToSet, lExceptionSettings.Item("System.OutOfMemoryException"));

        // This does not work to set the whole group on/off:
        //lExceptionSettings.SetBreakWhenThrown(true, lExceptionSettings.Item("<All Common Language Runtime Exceptions not in this list>"));

        // This is really slow
        //foreach (var lExceptionSetting in lExceptionSettings)
        //{
        //    lExceptionSettings.SetBreakWhenThrown(lExceptionsEnabledToSet, lExceptionSetting as ExceptionSetting);
        //}
    }
}