Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用EnvDTE.ExecuteCommand以编程方式开始调试特定项目_C#_Visual Studio_Debugging_Scripting_Automation - Fatal编程技术网

C# 使用EnvDTE.ExecuteCommand以编程方式开始调试特定项目

C# 使用EnvDTE.ExecuteCommand以编程方式开始调试特定项目,c#,visual-studio,debugging,scripting,automation,C#,Visual Studio,Debugging,Scripting,Automation,我有一个包含多个启动项目的解决方案,我正在尝试每晚自动重新启动其中一个项目,同时将新流程连接到同一个调试器 我能够重新启动进程(使用process.Start)并将当前的调试器附加到它,但到目前为止,它的可靠性并不高,而且按设计,单击停止按钮只会从进程中分离,而不是终止它 我知道VisualStudio团队已经发布了一个允许,它可能比我的代码工作得更好,但它不可移植,因为它需要本地配置 实现我所需的最简单的方法似乎是使用IDE本身以编程方式重新启动项目,就像我通过右键单击项目并选择Debug>S

我有一个包含多个启动项目的解决方案,我正在尝试每晚自动重新启动其中一个项目,同时将新流程连接到同一个调试器

我能够重新启动进程(使用
process.Start
)并将当前的调试器附加到它,但到目前为止,它的可靠性并不高,而且按设计,单击停止按钮只会从进程中分离,而不是终止它

我知道VisualStudio团队已经发布了一个允许,它可能比我的代码工作得更好,但它不可移植,因为它需要本地配置

实现我所需的最简单的方法似乎是使用IDE本身以编程方式重新启动项目,就像我通过右键单击项目并选择Debug>Start New Instance手动执行的那样。我可以访问代码中的相关DTE对象(在开发中)

因此,有没有办法让下面的伪代码工作,要求VisualStudio通过将特定的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命令的完整列表:

要解决此问题,需要先使用DTE对象设置当前项目选择,然后执行
Startnewinstance
命令

DTE.ToolWindows.SolutionExplorer.GetItem("SolutionNameHere\\ProjectNameHere").Select(vsUISelectionType.vsUISelectionTypeSelect)
DTE.ExecuteCommand("ClassViewContextMenus.ClassViewProject.Debug.Startnewinstance")

注意:根据您的编程语言,可能需要也可能不需要双反斜杠转义。最后一个字符串应该只有一个反斜杠。

感谢您的解决方案,它并不完美,因为如果用户在代码启动的同时弄乱了选择,可能会出现问题,但它很可能是使用标准IDE命令的最佳答案(我希望Visual Studio API更全面)。如果代码是同步执行的,则不应有任何时间窗口供用户干扰。这是VS2010中宏的标准使用模式。另一种方法是通过DTE.Debugger路由,该路由允许您访问较低级别的Debugger5接口,您可以从该接口获得一个Process4接口,以便在启动进程后将调试器附加到该接口。但这超出了您最初问题(即VS命令)的范围。很高兴知道这一点。我对您提到的带有Debugger5接口的替代解决方案非常感兴趣。是否可以从调试器对象本身而不是附加到调试器对象开始调试程序(exe或project)?下面是我用来附加到现有进程的代码。我的代码可以工作,但我更希望由调试器本身启动项目,使其具有与我手动启动时完全相同的行为(进程在“停止”时被终止,而不是分离,并且出现可见断点中断)。您的代码与我以前使用调试器接口的方式非常相似。据我所知,您只能使用接口连接到进程,它不负责启动它们。从我对文档的搜索中,除了我在回答中所描述的以外,自动化模型中似乎没有为特定项目启动调试的方法。但是,对于仍然存在的流程问题,您可以(ab)使用托管调试引擎不支持从流程分离的事实,它将在调试会话结束时杀死它们。您可以从Process4接口使用Attach2方法来指定本机调试引擎和托管调试引擎。然而,这是一个相当肮脏的黑客行为,不能保证将来一定会奏效。另请参见: