您可以監控與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;
}
在我的機器事件的順序如下:
- OnBeforeExecute
Debug.Start
- OnBuildBegin
- OnAfterExecute
Debug.Start
- OnBuildDone
所以,如果你看到這個序列,它將會跟着一個調試會話。
完成Serge答案。其實我看到這個命令:
- OnBeforeExecute
Debug.Start
- OnAfterExecute
Debug.Start
- OnBuildBegin
- OnBuildDone
而且如果VisualStudio的估計,它沒有任何調試之前建立OnBuildBegin
被跳過。 (在VS2010/2012/2013/2015上測試)之後總是執行OnBuildDone
。
刺探他人命令後可以看到兩個命令Build.SolutionConfigurations
(並且有時還一個或幾個Debug.StartupProject
)的之間跑在之前/執行Debug.Start
後(I僅在VS2013/2015觀察到了這種行爲)。
- OnBeforeExecute
Debug.Start
- OnBeforeExecute
Build.SolutionConfigurations
- OnAfterExecute
Build.SolutionConfigurations
- OnBeforeExecute
Build.SolutionConfigurations
- OnAfterExecute
Build.SolutionConfigurations
- OnBeforeExecute
Debug.StartupProjects
- OnAfterExecute
Debug.StartupProjects
- OnAfterExecute
Debug.Start
- OnBuildBegin
- OnBuildDone
因此,我們可以推斷,一個成功的構建之後,將調試會話發生在這兩個事件之一發生:
- 當
Build.SolutionConfigurations
或Debug.StartupProjects
命令在之前/之後觸發命令。
- 當在最後的OnAfterExecute
Debug.Start
和當前的OnBuildBegin
或OnBuildDone
之間小於一秒時。
作爲一個側面說明了命令Debug.StartWithoutDebugging
起着相同的作用Debug.Start
當用戶要求啓動無需調試。因此,我們還可以推斷出成功構建後將運行(不進行調試)會話
您可以使用IVsDebugger.AdviseDebuggerEvents確定調試器更改模式,然後調用IVsDebuggerEvents實現。 OnModeChange()(帶有DBGMODE_Run)但是這會發生在構建完成後,所以它只比一個等待更清潔一點。 –