Visual Studio如何以编程方式附加到托管进程

3
我正在尝试编程方式调试IISExpress进程。在使用Visual Studio附加到进程窗口时,我必须选择Managed Code作为要附加的类型。如果选择自动检测,则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库无法建议调试器附加到托管代码?
3个回答

4

Hans,你是一个传奇。这个程序完美地运行了!我会在另一个答案中发布稍作修改的代码。 - Max
代码可以通过直接将字符串参数 "native" 传递到 attach2 方法中来简化。就像这里描述的一样:http://msdn.microsoft.com/en-us/library/envdte80.process2.attach2.aspx。 - Herman

0

从Hans的答案中获取并修改的工作代码:

    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的引用,但我怀疑如果您只使用debugger2而不是debugger5,则只需要EnvDTE80。


0
你可以在你的代码中实现这个功能。
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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接