Visual Studio自动化 - 调试器退出事件和状态代码

时间:2015-08-19 09:37:31

标签: c# visual-studio visual-studio-2013 envdte

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

我正在启动这样的调试器(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;
    }
}

我希望在调试过程退出时运行更多代码,并且该代码需要知道调试过程的退出状态。可以吗?

1 个答案:

答案 0 :(得分:0)

您可以通过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;
    }
}