在Visual Studio中触发事件时中断调试器

本文关键字:事件 中断 调试器 Visual Studio | 更新日期: 2023-09-27 18:09:15

只是一个小问题:调试器是否有可能在事件触发时中断?

在Visual Studio中触发事件时中断调试器

你不能为在应用程序中引发的所有事件注册一个全局处理程序,但是你可以为静态事件注册你自己的处理程序,在Reflection的帮助下:

public class Program
{
    public static void Main(string[] args)
    {
        MethodInfo handler = typeof(Program).GetMethod("GlobalEventHandler");
        IEnumerable<EventInfo> events = AppDomain.CurrentDomain
            .GetAssemblies()
            .Select(a => a.GetTypes()
                          .Select(t => t.GetEvents(
                                            BindingFlags.Public |
                                            BindingFlags.NonPublic |
                                            BindingFlags.Static)
                                         .Where(e => typeof(EventHandler)
                                                     .IsAssignableFrom(e.EventHandlerType))))
            .SelectMany(e => e)
            .SelectMany(e => e);
        foreach (EventInfo evt in events)
            evt.GetAddMethod(true).Invoke(null, new object[]
            {
                Delegate.CreateDelegate(evt.EventHandlerType, null, handler)
            });
    }
    public static void GlobalEventHandler(object sender, EventArgs args)
    {
        Debugger.Break(); // <-- When a static event is fired, the application will break here
        Console.WriteLine("An event was fired!");
    }

支持的静态事件并不多。

16实际上:

  1. 应用程序。ApplicationExit
  2. 应用程序。闲置
  3. 应用程序。EnterThreadModal
  4. 应用程序。LeaveThreadModal
  5. 应用程序。ThreadExit
  6. ToolStripManager。RendererChanged
  7. SystemEvents。DisplaySettingsChanging
  8. SystemEvents。DisplaySettingsChanged
  9. SystemEvents。EventsThreadShutdown
  10. SystemEvents。InstalledFontsChanged
  11. SystemEvents。LowMemory
  12. SystemEvents。PaletteChanged
  13. SystemEvents。TimeChanged
  14. ComponentDispatcher。ThreadIdle
  15. ComponentDispatcher。EnterThreadModal
  16. ComponentDispatcher。LeaveThreadModal