Visual Studio Automation -调试器退出事件和状态代码

本文关键字:出事件 状态 代码 退出 调试器 Studio Automation Visual | 更新日期: 2023-09-27 18:08:35

在Visual Studio 2013自动化项目(即Visual Studio Package项目)中,我如何在调试进程退出时运行事件处理程序,以及如何找出已调试进程的退出代码是什么?

我像这样启动调试器(c#):

var dte = ...;
foreach (EnvDTE.Project proj in dte.Solution.Projects)
{
    if (proj.Name == "blahblah")
    {
        dte.Solution.Properties.Item("StartupProject").Value = proj.Name;
        dte.Debugger.Go(false);
        break;
    }
}

我想要更多的代码在被调试的进程退出时运行,这些代码需要知道被调试的进程的退出状态。这能做到吗?

Visual Studio Automation -调试器退出事件和状态代码

您可以通过COM接口完成此操作(绕过EnvDTE自动化层,该层主要只是一个花哨的包装器)。

class ExitEventListener : IDebugEventCallback2
{
    private IVsDebugger _debugger;
    public ExitEventListener()
    {
        _debugger = Package.GetGlobalService(typeof(SVsShellDebugger)) as IVsDebugger;
        if (_debugger != null)
            _debugger.AdviseDebugEventCallback(this);
    }
    public int Event(IDebugEngine2 pEngine, IDebugProcess2 pProcess, IDebugProgram2 pProgram, IDebugThread2 pThread, IDebugEvent2 pEvent, ref Guid riidEvent, uint dwAttrib)
    {
        if (pEvent is IDebugProgramDestroyEvent2)
        {
            // The process has exited
            uint exitCode;
            if (((IDebugProgramDestroyEvent2)pEvent).GetExitCode(out exitCode) == VSConstants.S_OK)
            {
                // We got the exit code!
            }
            // Stop listening for future exit events
            _debugger.UnadviseDebugEventCallback(this);
            _debugger = null;
        }
        return VSConstants.S_OK;
    }
}