簡體   English   中英

Visual Studio以編程方式附加到托管進程

[英]Visual Studio attach to managed process programmatically

我正在嘗試以編程方式附加到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的引用,但我懷疑如果您只是堅持使用debugger2而不是調試器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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM