在 VS 2010 调试器中重新启动程序

Relaunch program in VS 2010 debugger

我有一个应用程序偶尔需要您在更改首选项后重新启动它。我通过调用来做到这一点:

System.Diagnostics.Process.Start(Application.ResourceAssembly.Location);

这对于已发布的版本来说很棒,但是当我调试时它真的很烦人,每当我需要更改首选项时它都会在调试器之外重新启动程序。

经过一些研究,我尝试从代码附加到调试器,但我尝试 运行 的代码已经 运行ning 在调试器中,应用程序将不久被杀死。所以我写了一个外部程序,可以在重新启动应用程序(并释放调试器)后调用,据称将其附加到调试器。不幸的是,这也不能真正完成工作。它似乎附加到调试器,但实际上并没有让我进行任何调试。如果我尝试暂停执行,它只会报错。

有什么想法吗?

经过更多研究,我意识到我想做的就是以编程方式点击“重启”按钮。我发现了这个:

EnvDTE.DTE dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0");
dte.ExecuteCommand("Debug.Restart");

效果很好!

如果您使用来自 EnvDTE 命名空间而不是 Process2Process 对象及其 Attach 方法,您可能无法使用您的代码进行调试EnvDTE80 命名空间中的对象及其 Attach2 方法。以下代码段应该有效:

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 上使用。