Visual Studio 以编程方式附加到托管进程
本文关键字:进程 方式附 Studio 编程 Visual | 更新日期: 2023-09-27 18:37:13
我正在尝试以编程方式附加到IISExpress进程以进行调试。使用 Visual Studio 附加到进程窗口时,我必须选择"托管代码"作为要附加到的类型。如果选择了自动检测,VS 会尝试将 IISExpress 调试为不起作用的 x86/本机应用程序。
以下代码(来自此答案)使用 DTE 附加调试器,但似乎未将其附加为托管代码。
public static void AttachVisualStudioToProcess(Process visualStudioProcess, Process applicationProcess)
{
_DTE visualStudioInstance;
if (TryGetVsInstance(visualStudioProcess.Id, out visualStudioInstance))
{
//Find the process you want the VS instance to attach to...
DTEProcess processToAttachTo = visualStudioInstance.Debugger.LocalProcesses.Cast<DTEProcess>().FirstOrDefault(process => process.ProcessID == applicationProcess.Id);
//Attach to the process.
if (processToAttachTo != null)
{
processToAttachTo.Attach();
ShowWindow((int)visualStudioProcess.MainWindowHandle, 3);
SetForegroundWindow(visualStudioProcess.MainWindowHandle);
}
else
{
throw new InvalidOperationException("Visual Studio process cannot find specified application '" + applicationProcess.Id + "'");
}
}
}
也许 DTE 库无法建议调试器应附加到托管代码?
您需要改用 Process2.Attach2() 方法,该方法自 VS2005 起可用。 它采用一个调试器引擎参数,该参数指定要使用的调试器类型。
示例代码在这里。
从汉斯的回答中获取和修改的工作代码:
public static void AttachVisualStudioToProcess(Process visualStudioProcess, Process applicationProcess)
{
_DTE visualStudioInstance;
if (TryGetVsInstance(visualStudioProcess.Id, out visualStudioInstance))
{
EnvDTE100.Debugger5 dbg5 = (EnvDTE100.Debugger5)visualStudioInstance.Debugger;
EnvDTE80.Transport trans = dbg5.Transports.Item("Default");
EnvDTE80.Engine dbgeng;
dbgeng = trans.Engines.Item("Managed (v4.5, v4.0)");
var proc2 = (EnvDTE80.Process2)dbg5.GetProcesses(trans, "WIN-86CEJEGQCPD").Item("iisexpress.exe");
proc2.Attach2(dbgeng);
}
}
我添加了对EnvDTE100,EnvDTE90,EnvDTE90a和EnvDTE80的引用,但我怀疑如果你只是坚持使用调试器2而不是调试器5,你只需要EnvDTE80。
你可以在代码中执行此操作。
public static void Attach(DTE2 dte)
{
var processes = dte.Debugger.LocalProcesses;
foreach (var proc in processes.Cast<EnvDTE.Process>().Where(proc => proc.Name.IndexOf("YourProcess.exe") != -1))
proc.Attach();
}
internal static DTE2 GetCurrent()
{
var dte2 = (DTE2)Marshal.GetActiveObject("VisualStudio.DTE.12.0"); // For VisualStudio 2013
return dte2;
}
用法:
Attach(GetCurrent());