2013-10-29 11 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에 대한 참조를 추가하지만 당신은 당신 만로드 EnvDTE80을 필요 debugger5보다는 debugger2에 붙은 경우, 나는 생각한다.

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