如何通过Visual Studio DTE启动附加调试器的进程?
解决方案
1. 跳过全进程遍历,通过进程ID直接附加调试器
你无需遍历所有本地进程来定位Processor——Process.Start会返回对应的Process实例,直接获取其ID后精准匹配即可,效率会大幅提升:
// 启动Processor进程 Process processorProcess = Process.Start("Processor.exe", "任务参数"); // 仅匹配目标进程ID完成附加 foreach (EnvDTE.Process proc in dte.Debugger.LocalProcesses) { if (proc.ProcessID == processorProcess.Id) { proc.Attach(); break; } }
2. 通过DTE调用IVsDebugger直接启动带调试的进程
DTE.Debugger没有原生的StartProcess方法,但可以通过DTE获取VS的IVsDebugger服务,实现直接启动并附加调试器:
using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Debugger.Interop; using System.Runtime.InteropServices; // 从DTE实例获取IVsDebugger服务 IVsDebugger debugger = (IVsDebugger)dte.GetService(typeof(SVsShellDebugger)); if (debugger != null) { // 配置调试目标参数 VsDebugTargetInfo[] targetInfo = new VsDebugTargetInfo[1]; targetInfo[0].cbSize = (uint)Marshal.SizeOf(typeof(VsDebugTargetInfo)); targetInfo[0].dlo = DEBUG_LAUNCH_OPERATION.DLO_CreateProcess; targetInfo[0].bstrExe = @"你的Processor.exe路径"; targetInfo[0].bstrArg = "启动参数"; targetInfo[0].bstrCurDir = @"Processor工作目录"; targetInfo[0].fSendStdoutToOutputWindow = 1; VsDebugTargetProcessInfo[] processInfo = new VsDebugTargetProcessInfo[1]; debugger.LaunchDebugTargets(1, targetInfo, processInfo); }
需注意:要引用VS安装目录Common7\IDE\PublicAssemblies下的Microsoft.VisualStudio.Shell.dll和Microsoft.VisualStudio.Debugger.Interop.dll。
3. 简化方案:通过环境变量自动触发调试器附加
启动Processor前设置特定环境变量,让VS自动识别并附加调试器,无需依赖DTE或IVsDebugger:
ProcessStartInfo startInfo = new ProcessStartInfo("Processor.exe", "任务参数"); // 设置VS调试器识别的环境变量 startInfo.EnvironmentVariables["COR_ENABLE_PROFILING"] = "1"; startInfo.EnvironmentVariables["COR_PROFILER"] = "{38B85C22-8DB5-11D3-B984-00C04F8EC28C}"; startInfo.EnvironmentVariables["VSDEBUGGER_ATTACHED"] = "1"; Process.Start(startInfo);
此方式兼容性受VS版本影响,适合快速调试场景。
内容的提问来源于stack exchange,提问作者msedi
相关产品推荐
相关产品推荐

