使用 EnvDTE.ExecuteCommand 以编程方式开始调试特定项目
Start debugging specific project programmatically using EnvDTE.ExecuteCommand
我有一个包含多个启动项目的解决方案,我正在尝试每晚自动重新启动其中一个,同时将新进程附加到同一个调试器。
我能够重新启动该进程(使用 Process.Start
)并将当前的调试器附加到它,但到目前为止它的可靠性并不高,而且根据设计,单击“停止”按钮只会从进程而不是终止它。
我知道 Visual Studio 团队发布了一个 Visual Studio extension that allows automatically attaching child processes to the current debugger,它可能比我的代码工作得更好,但它不能移植,因为它需要本地配置。
实现我需要的最简单方法似乎是使用 IDE 本身以编程方式重新启动项目,就像我通过右键单击项目并选择 Debug > Start New 手动操作一样实例。我可以访问我的代码中的相关 DTE 对象(在开发中)。
因此,是否有任何方法可以使以下伪代码工作,要求 Visual Studio 开始调试 specific project/exe 通过将其作为命令参数?
DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance", "ProjectToBeRestarted");
DTE.ExecuteCommand("Debug.Start", "ProjectToBeRestarted");
DTE.ExecuteCommand("Debug.Start", "ProjectToBeRestarted.exe");
我想尽量避免对 UI 进行操作(如存储原始启动项目、设置新启动项目以及恢复启动项目)。
您面临的问题是很少 Visual Studio 命令接受参数作为输入。考虑到命令通常使用当前 IDE 上下文(例如选择、插入符号位置等)来推断实际应该做什么,这是有道理的。例如,ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance
命令依赖于解决方案资源管理器中当前选定的项目来知道从哪个项目开始调试,并且它不接受参数。
作为参考,您可以在此处找到接受参数的 Visual Studio 命令的完整列表:https://msdn.microsoft.com/en-us/library/c338aexd.aspx
要解决您的问题,您需要先使用DTE对象设置当前项目选择,然后执行Startnewinstance
命令。
DTE.ToolWindows.SolutionExplorer.GetItem("SolutionNameHere\ProjectNameHere").Select(vsUISelectionType.vsUISelectionTypeSelect)
DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance")
注意:根据您的编程语言,可能需要也可能不需要双反斜杠转义符。最后的字符串应该只有一个反斜杠。
我有一个包含多个启动项目的解决方案,我正在尝试每晚自动重新启动其中一个,同时将新进程附加到同一个调试器。
我能够重新启动该进程(使用 Process.Start
)并将当前的调试器附加到它,但到目前为止它的可靠性并不高,而且根据设计,单击“停止”按钮只会从进程而不是终止它。
我知道 Visual Studio 团队发布了一个 Visual Studio extension that allows automatically attaching child processes to the current debugger,它可能比我的代码工作得更好,但它不能移植,因为它需要本地配置。
实现我需要的最简单方法似乎是使用 IDE 本身以编程方式重新启动项目,就像我通过右键单击项目并选择 Debug > Start New 手动操作一样实例。我可以访问我的代码中的相关 DTE 对象(在开发中)。
因此,是否有任何方法可以使以下伪代码工作,要求 Visual Studio 开始调试 specific project/exe 通过将其作为命令参数?
DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance", "ProjectToBeRestarted");
DTE.ExecuteCommand("Debug.Start", "ProjectToBeRestarted");
DTE.ExecuteCommand("Debug.Start", "ProjectToBeRestarted.exe");
我想尽量避免对 UI 进行操作(如存储原始启动项目、设置新启动项目以及恢复启动项目)。
您面临的问题是很少 Visual Studio 命令接受参数作为输入。考虑到命令通常使用当前 IDE 上下文(例如选择、插入符号位置等)来推断实际应该做什么,这是有道理的。例如,ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance
命令依赖于解决方案资源管理器中当前选定的项目来知道从哪个项目开始调试,并且它不接受参数。
作为参考,您可以在此处找到接受参数的 Visual Studio 命令的完整列表:https://msdn.microsoft.com/en-us/library/c338aexd.aspx
要解决您的问题,您需要先使用DTE对象设置当前项目选择,然后执行Startnewinstance
命令。
DTE.ToolWindows.SolutionExplorer.GetItem("SolutionNameHere\ProjectNameHere").Select(vsUISelectionType.vsUISelectionTypeSelect)
DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance")
注意:根据您的编程语言,可能需要也可能不需要双反斜杠转义符。最后的字符串应该只有一个反斜杠。