2015-11-23 23 views
0

我想我的VSIX在我的BuildEvents.OnBuildDone處理程序中做了一些不同的事情,如果構建已經被觸發是因爲用戶想要啓動調試會話。我如何從我的VSIX知道構建之後將進行調試會話?

我試過......

private void m_BuildEvents_OnBuildDone(vsBuildScope scope, vsBuildAction action) { 
    if (m_DTE.Mode == vsIDEMode.vsIDEModeDebug) { 
     //... 
    } 
} 

...但不幸的是在這一點上m_DTE.Mode尚未等於vsIDEMode.vsIDEModeDebug

我可以啓動一個或兩個秒計時器,然後檢查是否(m_DTE.Mode == vsIDEMode.vsIDEModeDebug)但這不是一個乾淨和可靠的解決方案。

我可以通過以某種方式查詢VSIX API,無論是在BuildEvents.OnBuildBegin還是BuildEvents.OnBuildDone處理程序,一個成功的生成將跟隨一個調試會話?

+1

您可以使用IVsDebugger.AdviseDebuggerEvents確定調試器更改模式,然後調用IVsDebuggerEvents實現。 OnModeChange()(帶有DBGMODE_Run)但是這會發生在構建完成後,所以它只比一個等待更清潔一點。 –

回答

3

您可以監控EnvDTE.CommandEvents Debug.Start命令調用。見Visual Commander下面的示例C#擴展:

public class E : VisualCommanderExt.IExtension 
{ 
    public void SetSite(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package) 
    { 
     events = DTE.Events; 
     commandEvents = events.get_CommandEvents(null, 0); 
     buildEvents = events.BuildEvents; 
     commands = DTE.Commands as EnvDTE80.Commands2; 

     commandEvents.BeforeExecute += OnBeforeExecute; 
     commandEvents.AfterExecute += OnAfterExecute; 

     buildEvents.OnBuildDone += OnBuildDone; 
     buildEvents.OnBuildBegin += OnBuildBegin; 
    } 

    public void Close() 
    { 
     commandEvents.BeforeExecute -= OnBeforeExecute; 
     commandEvents.AfterExecute -= OnAfterExecute; 

     buildEvents.OnBuildDone -= OnBuildDone; 
     buildEvents.OnBuildBegin -= OnBuildBegin; 
    } 

    private void OnBeforeExecute(string Guid, int ID, object CustomIn, object CustomOut, ref bool CancelDefault) 
    { 
     string name = GetCommandName(Guid, ID); 
     if (name == "Debug.Start") 
     { 
      System.Windows.MessageBox.Show("OnBeforeExecute Debug.Start"); 
     } 
    } 

    private void OnAfterExecute(string Guid, int ID, object CustomIn, object CustomOut) 
    { 
     string name = GetCommandName(Guid, ID); 
     if (name == "Debug.Start") 
     { 
      System.Windows.MessageBox.Show("OnAfterExecute Debug.Start " + System.DateTime.Now.Second + "." + System.DateTime.Now.Millisecond); 
     } 
    } 

    private void OnBuildDone(EnvDTE.vsBuildScope scope, EnvDTE.vsBuildAction action) 
    { 
     System.Windows.MessageBox.Show("OnBuildDone " + System.DateTime.Now.Second + "." + System.DateTime.Now.Millisecond); 
    } 

    private void OnBuildBegin(EnvDTE.vsBuildScope scope, EnvDTE.vsBuildAction action) 
    { 
     System.Windows.MessageBox.Show("OnBuildBegin " + System.DateTime.Now.Second + "." + System.DateTime.Now.Millisecond); 
    } 

    // throw() 
    private string GetCommandName(string Guid, int ID) 
    { 
     if (Guid == null) 
      return "null"; 

     string result = ""; 
     if (commands != null) 
     { 
      try 
      { 
       return commands.Item(Guid, ID).Name; 
      } 
      catch (System.Exception) 
      { 
      } 
     } 
     return result; 
    } 

    private EnvDTE.Events events; 
    private EnvDTE.CommandEvents commandEvents; 
    private EnvDTE.BuildEvents buildEvents; 
    private EnvDTE80.Commands2 commands; 
} 

在我的機器事件的順序如下:

  1. OnBeforeExecute Debug.Start
  2. OnBuildBegin
  3. OnAfterExecute Debug.Start
  4. OnBuildDone

所以,如果你看到這個序列,它將會跟着一個調試會話。


完成Serge答案。其實我看到這個命令:

  1. OnBeforeExecute Debug.Start
  2. OnAfterExecute Debug.Start
  3. OnBuildBegin
  4. OnBuildDone

而且如果VisualStudio的估計,它沒有任何調試之前建立OnBuildBegin被跳過。 (在VS2010/2012/2013/2015上測試)之後總是執行OnBuildDone

刺探他人命令後可以看到兩個命令Build.SolutionConfigurations(並且有時還一個或幾個Debug.StartupProject)的之間跑在之前/執行Debug.Start後(I僅在VS2013/2015觀察到了這種行爲)。

  1. OnBeforeExecute Debug.Start
  2. OnBeforeExecute Build.SolutionConfigurations
  3. OnAfterExecute Build.SolutionConfigurations
  4. OnBeforeExecute Build.SolutionConfigurations
  5. OnAfterExecute Build.SolutionConfigurations
  6. OnBeforeExecute Debug.StartupProjects
  7. OnAfterExecute Debug.StartupProjects
  8. OnAfterExecute Debug.Start
  9. OnBuildBegin
  10. OnBuildDone

因此,我們可以推斷,一個成功的構建之後,將調試會話發生在這兩個事件之一發生:

  • Build.SolutionConfigurationsDebug.StartupProjects命令在之前/之後觸發命令。
  • 當在最後的OnAfterExecute Debug.Start和當前的OnBuildBeginOnBuildDone之間小於一秒時。

作爲一個側面說明了命令Debug.StartWithoutDebugging起着相同的作用Debug.Start當用戶要求啓動無需調試。因此,我們還可以推斷出成功構建後將運行(不進行調試)會話

+0

不錯,除了我得到的命令OnBeforeExecute Debug.Start - > OnAfterExecute調試。開始 - > OnBuildBegin - > OnBuildDone無論如何,這足以讓信息「一個成功的構建將緊接着一個調試會話」非常感謝Serge –

+0

一個問題,爲什麼你有if(commands!= null)?在這種情況下,它預計爲空? (我知道如何隨機行爲VS API可以,但仍然問:) –

+1

@PatrickfromNDependteam我不知道情況下,當命令== null。只是防禦性編碼:) –

相關問題