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