简体   繁体   English

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

[英]Visual Studio attach to managed process programmatically

I'm trying to programmatically attach to an IISExpress process for debugging. 我正在尝试以编程方式附加到IISExpress进程进行调试。 When using the Visual Studio attach to process window I have to select Managed Code as the type to attach to. 使用Visual Studio附加到进程窗口时,我必须选择托管代码作为要附加的类型。 If auto detect is selected instead, VS tries to debug IISExpress as an x86/native application which does not work. 如果选择自动检测,VS会尝试将IISExpress调试为x86 /本机应用程序,但不起作用。

The following code (from this answer ) using DTE attaches the debugger but does not appear to attach it as managed code. 以下代码(来自此答案 )使用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 + "'");
        }
    }
}

Perhaps the DTE library is incapable of suggesting that the debugger should attach to managed code? 也许DTE库无法建议调试器应该附加到托管代码?

You need to use the Process2.Attach2() method instead, available since VS2005. 您需要使用Process2.Attach2()方法 ,自VS2005起可用。 It takes a debugger engine argument that specifies the kind of debugger you want to use. 它需要一个调试器引擎参数,指定您要使用的调试器类型。

Sample code is here . 示例代码在这里

Working code taken and modified from Hans' answer: 从汉斯的答案中采取和修改的工作代码:

    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);


        }
    }

I added references to EnvDTE100, EnvDTE90, EnvDTE90a and EnvDTE80 but I suspect if you just stick to debugger2 rather than debugger5 you would only need EnvDTE80. 我添加了对EnvDTE100,EnvDTE90,EnvDTE90a和EnvDTE80的引用,但我怀疑如果您只是坚持使用debugger2而不是调试器5,那么您只需要EnvDTE80。

You can do this in your code. 您可以在代码中执行此操作。

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;
        }

Usage: 用法:

Attach(GetCurrent());

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM