2015-08-19 96 views
0

在Visual Studio 2013自動化項目(即Visual Studio Package項目)中,如何在調試過程退出時運行事件處理程序,以及如何找出調試過程的退出代碼是?Visual Studio Automation - 調試器退出事件和狀態代碼

我開始像這樣(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; 
    } 
} 

我希望有更多的代碼時,調試過程中退出,並且代碼需要知道調試進程的退出狀態運行。可以做到嗎?

+0

是的,它可以做到。您需要在'dte.Debugger.Events'(或'dte.DebugEvents'?)中訂閱適當的事件,並且保留對DTE事件對象的引用,以便在實際事件被觸發前不會收集垃圾。此外,您對項目的循環可能會中斷 - 它會跳過解決方案文件夾中的所有項目,並將解決方案文件夾視爲項目...老實說,如果您可以在沒有*醜陋的EnvDTE界面的情況下執行您想要的操作(即通過真實COM接口),你可能會更好,但它會*更多的代碼/工作。 – Cameron

+0

感謝有關解決方案文件夾等指針。我得到的將爲我的目的,但我會着手修復它。 – Tom

+0

我想'dte.Events.DebugEvents.OnEnterDesignMode'是你想要的事件嗎?但是,如何獲得調試過程的退出代碼? – Tom

回答

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; 
    } 
} 
相關問題