如何在 Visual Studio 调试期间查找当前订阅 WPF/C# 事件的所有方法
How to find all methods currently subscribed to an event in WPF / C# during debugging in Visual Studio
我对 WPF 很陌生,对 C# 也很陌生,现在继承了一个超过 60k 行代码的 C#/WPF 应用程序(没有使用 MVVM,设计模式相当临时)。现在,我必须在 UI 中更改一个相当小的东西,但是这个控件非常重要,因此在整个解决方案中很重要。我知道 Visual Studio 中的 "Live Visual Tree" 函数,也知道 Live 属性 Explorer。但是,我想要 "Live EVENT Explorer" 之类的东西来查看向该控件的事件注册了哪些方法。我想要这样的东西:
a) 可以查看哪些方法当前订阅了特定事件(例如 ListView 的 SelectionChanged 事件)。 "currently" 我的意思是,根据选择的单选按钮和复选框等,订阅的方法发生了很大变化。所以我想做出我需要的所有选择,然后检查控件,看看有什么方法订阅了它的事件之一。
b) 例如,如果我更改控件中的选择,则有可能在此事件触发的第一个方法中立即停止。以便我可以单步执行以下所有代码?
你们中的任何人是否知道 Visual Studio 中的内置函数是否可以实现其中任何一个以及如何做到这一点?或者是否有其他工具可以实现这样的目标?
在大多数情况下,Find All References 应该涵盖它,但是当事件不够独特时,这会失败(想象一下 Button.Click)。
您可以通过浏览到事件对象并检查 _invocationList
字段在调试器中访问它。如果此字段未填充,请查看 _methodPtr
字段。如果两个字段都为空,则没有人订阅。
_target
是包含订阅方法的对象。如果为null,则订阅静态方法(这使得目标对象的识别much more tricky). Otherwise, you can dump the method table找到订阅的方法。
在 Visual studio 中,调试工具提示让这一切变得简单。对于单播委托,将鼠标悬停在事件上会显示声明类型和方法名称(如果需要,还有元数):
对于多播,_invocationList
接管:
我对 WPF 很陌生,对 C# 也很陌生,现在继承了一个超过 60k 行代码的 C#/WPF 应用程序(没有使用 MVVM,设计模式相当临时)。现在,我必须在 UI 中更改一个相当小的东西,但是这个控件非常重要,因此在整个解决方案中很重要。我知道 Visual Studio 中的 "Live Visual Tree" 函数,也知道 Live 属性 Explorer。但是,我想要 "Live EVENT Explorer" 之类的东西来查看向该控件的事件注册了哪些方法。我想要这样的东西:
a) 可以查看哪些方法当前订阅了特定事件(例如 ListView 的 SelectionChanged 事件)。 "currently" 我的意思是,根据选择的单选按钮和复选框等,订阅的方法发生了很大变化。所以我想做出我需要的所有选择,然后检查控件,看看有什么方法订阅了它的事件之一。
b) 例如,如果我更改控件中的选择,则有可能在此事件触发的第一个方法中立即停止。以便我可以单步执行以下所有代码?
你们中的任何人是否知道 Visual Studio 中的内置函数是否可以实现其中任何一个以及如何做到这一点?或者是否有其他工具可以实现这样的目标?
在大多数情况下,Find All References 应该涵盖它,但是当事件不够独特时,这会失败(想象一下 Button.Click)。
您可以通过浏览到事件对象并检查 _invocationList
字段在调试器中访问它。如果此字段未填充,请查看 _methodPtr
字段。如果两个字段都为空,则没有人订阅。
_target
是包含订阅方法的对象。如果为null,则订阅静态方法(这使得目标对象的识别much more tricky). Otherwise, you can dump the method table找到订阅的方法。
在 Visual studio 中,调试工具提示让这一切变得简单。对于单播委托,将鼠标悬停在事件上会显示声明类型和方法名称(如果需要,还有元数):
对于多播,_invocationList
接管: