我有一个应用程序偶尔会要求您在更改首选项后重新启动它。我通过致电:
来做到这一点System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);
这对于发布的版本来说非常棒,但是当我调试时它真的很烦人,并且每当我需要更改首选项时它会在调试器外重新启动程序。
经过一些研究,我尝试从代码中附加到调试器,但我正在尝试运行的代码已经在调试器中运行,应用程序将很快被杀死。所以我编写了一个外部程序,可以在重新启动应用程序(并释放调试器)之后调用,该程序应该将它附加到调试器上。不幸的是,这并没有真正完成这项工作。它似乎附加到调试器,但它实际上并没有让我做任何调试。如果我尝试暂停执行,它只会出错。
有什么想法吗?
答案 0 :(得分:1)
经过更多的研究,我意识到我想要做的就是以编程方式点击“重启”按钮。我发现了这个:
EnvDTE.DTE dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0");
dte.ExecuteCommand("Debug.Restart");
效果很好!
答案 1 :(得分:0)
如果您使用Process
对象及Attach
命名空间中的EnvDTE
方法而不是Process2
对象,则可能无法使用代码进行调试来自Attach2
命名空间的EnvDTE80
方法。以下代码段应该有效:
foreach (Process2 process in Dte.Debugger.LocalProcesses) {
if (process.ProcessID == processId) {
process.Attach2();
Dte.Debugger.CurrentProcess = process;
}
}
这里也可能有兴趣:Visual Studio团队发布了一个Visual Studio扩展,允许自动将子进程附加到当前调试器:Introducing the Child Process Debugging Power Tool。
Visual Studio 2013及更高版本的Gallery可以使用它。