我有一个包含多个启动项目的解决方案,我试图在每晚自动重新启动其中一个,同时保持新进程连接到同一个调试器。
我能够重新启动进程(使用Process.Start
)并将当前调试器附加到它,但到目前为止它还不是很可靠,并且按照设计,单击“停止”按钮只会从进程中分离出来而不是终止它。
我知道Visual Studio团队发布了一个允许Visual Studio extension automatically attaching child processes to the current debugger的{{3}},它可能比我的代码更好用,但它不可移植,因为它需要本地配置。
实现我需要的最简单的方法似乎是使用IDE本身以编程方式重新启动项目,就像我通过右键单击项目并选择 Debug>手动完成一样。启动新实例。我可以在我的代码中访问相关的DTE对象(在开发时)。
因此,有没有办法让以下伪代码工作,要求Visual Studio通过将其作为命令参数传递来开始调试特定的项目/ exe?
DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance", "ProjectToBeRestarted");
DTE.ExecuteCommand("Debug.Start", "ProjectToBeRestarted");
DTE.ExecuteCommand("Debug.Start", "ProjectToBeRestarted.exe");
我希望尽可能避免操作UI(比如存储原始启动项目,设置新项目,以及恢复启动项目)。
答案 0 :(得分:4)
您遇到的问题是很少有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")
注意:根据您的编程语言,可能需要也可能不需要双反斜杠转义。最后一个字符串应该只有一个反斜杠。