2013-10-29 140 views
2

我试图以编程方式附加到IISExpress进程以进行调试。当使用Visual Studio附加到进程窗口时,我必须选择托管代码作为附加到的类型。如果选择自动检测,VS会尝试将IISExpress作为x86 /本机应用程序进行调试,该应用程序不起作用。Visual Studio以编程方式附加到托管进程

使用DTE的以下代码(来自此answer)会附加调试器,但似乎不会将其作为托管代码附加。

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

您需要使用Process2.Attach2() method,而不是从VS2005开始提供。它需要一个调试器引擎参数来指定您想要使用的调试器的类型。

样本代码is here。从汉斯的答案采取和修改

+0

汉斯,你是一个传奇。这完美的作品!我会在另一个答案中发布稍有修改的代码。 – Max

+0

通过将字符串参数“native”直接传递给attach2方法,可以简化代码。如此处所述:http://msdn.microsoft.com/en-us/library/envdte80.process2.attach2.aspx。 – Herman

0

工作代码:

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()); 
相关问题