Feb 28, 2013

Visual 2010 Macro: Automate “Attach to Process” to IIS Worker Process (w3wp.exe)

If you take a look at my post a few months ago about my own development environment, maybe you didn’t notice that I posted a link to a macro. This macro I’ve created myself to help me build SharePoint solutions faster than normally we do, rather than we do an “Attach to Process” on the menu and search which w3wp, or even worse, by attaching it to all w3wp which we don’t need.

So, in the code below, I put 2 functions, AttachW3WP(string AppPoolName) and AttachProcess(string ProcessName). Same way, you can create another function, call that function to attach to particular w3wp process with specific Application Pool Name.

This should work with IIS 7.0 above, as IIS 6.0 (or even IIS 5.1) I’ve never tested it out.

Attach To Process
  1. Imports System
  2. Imports EnvDTE
  3. Imports EnvDTE80
  4. Imports EnvDTE90
  5. Imports EnvDTE90a
  6. Imports EnvDTE100
  7. Imports System.Diagnostics
  8. Imports System.Linq
  9. Imports System.ComponentModel
  10. Imports System.Collections
  11. Imports System.Collections.Generic
  12. Imports System.Management
  13.  
  14.  
  15. Public Module RdzMacros
  16.     Dim DebugPanel As String = "Debug"
  17.     Dim Ow As OutputWindow = DTE.ToolWindows.OutputWindow
  18.     Dim Owp As OutputWindowPane
  19.     Dim SetName As String = "ApplicationPoolName"
  20.     Dim Titl As String = "AttachW3WP"
  21.  
  22.  
  23.     Private Sub PanelInit()
  24.         Try
  25.             Owp = Ow.OutputWindowPanes(DebugPanel)
  26.         Catch ex As Exception
  27.             If Owp Is Nothing Then
  28.                 Owp = Ow.OutputWindowPanes.Add(DebugPanel)
  29.             End If
  30.         End Try
  31.     End Sub
  32.  
  33.     Private Function GetAppPoolName() As String
  34.         Dim sRet As String = ""
  35.         Try
  36.             sRet = DTE.Solution.Globals(SetName)
  37.         Catch ex As Exception
  38.         End Try
  39.         Return sRet
  40.     End Function
  41.  
  42.     Private Sub AttachW3WP(ByVal AppPoolName As String)
  43.         PanelInit()
  44.         Dim attached As Boolean = False
  45.         Dim proc As EnvDTE.Process
  46.         Dim ProcessName As String = "w3wp.exe"
  47.         Dim PID As Integer = 0
  48.         Dim CmdLine As String = AppPoolName 'GetAppPoolName()
  49.         If String.IsNullOrEmpty(CmdLine) Then
  50.             MsgBox("Set Application Pool Name first via 'SetApplicationPoolName' macro.", MsgBoxStyle.Critical, Titl)
  51.             Exit Sub
  52.         End If
  53.  
  54.         Owp.OutputString(String.Format("Search for IIS Worker Processes with AppPool '{0}'...", CmdLine))
  55.         Dim wmiQuery As String = "select CommandLine,ProcessID from Win32_Process where Name='" + ProcessName + "'"
  56.         Dim searcher As ManagementObjectSearcher = New ManagementObjectSearcher(wmiQuery)
  57.         Dim retObjectCollection As ManagementObjectCollection = searcher.Get
  58.         For Each retObject As ManagementObject In retObjectCollection
  59.             If retObject("CommandLine").ToString().ToLower().Contains("\" + CmdLine.ToLower() + "\") = True Then
  60.                 PID = Convert.ToInt32(retObject("ProcessID").ToString())
  61.                 Owp.OutputString(String.Format("Found the ProcessID: {0}...", PID.ToString))
  62.                 Exit For
  63.             End If
  64.         Next
  65.  
  66.         If PID > 0 Then
  67.             For Each proc In DTE.Debugger.LocalProcesses
  68.                 If proc.ProcessID = PID Then
  69.                     proc.Attach()
  70.                     attached = True
  71.                     Exit For
  72.                 End If
  73.             Next
  74.         End If
  75.         If Not attached Then
  76.             MsgBox("w3wp.exe with Argument '" + CmdLine + "' is not running!", MsgBoxStyle.Exclamation, "MiKrosok Pisual Studio 2010")
  77.         Else
  78.             Owp.OutputString(String.Format("ProcessID {0} already attached to VS debugger!", PID.ToString))
  79.             Owp.Activate()
  80.         End If
  81.     End Sub
  82.  
  83.     Private Sub AttachProcess(ByVal ProcessName As String)
  84.         PanelInit()
  85.         Dim attached As Boolean = False
  86.         Dim proc As EnvDTE.Process
  87.  
  88.         For Each proc In DTE.Debugger.LocalProcesses
  89.             If proc.Name.ToLower().Contains(ProcessName.ToLower()) Then
  90.                 proc.Attach()
  91.                 attached = True
  92.                 Exit For
  93.             End If
  94.         Next
  95.         If Not attached Then
  96.             MsgBox("'" + ProcessName + "' is not running!", MsgBoxStyle.Exclamation, "MiKrosok Pisual Studio 2010")
  97.         Else
  98.             Owp.OutputString(String.Format("ProcessName {0} already attached to VS debugger!", ProcessName))
  99.             Owp.Activate()
  100.         End If
  101.     End Sub
  102.  
  103.     Public Sub AttachOWSTimer()
  104.         AttachProcess("owstimer.exe")
  105.     End Sub
  106.  
  107.     Public Sub AttachOSCAR()
  108.         AttachW3WP("SharePoint - 80")
  109.     End Sub
  110.  
  111.     Public Sub AttachK2WorklistService()
  112.         AttachW3WP("K2WorklistService")
  113.     End Sub
  114.  
  115.     Public Sub AttachCommonWorkflowServices()
  116.         AttachW3WP("CommonWorkflowServices")
  117.     End Sub
  118.  
  119.     Public Sub AttachEIS()
  120.         AttachW3WP("SharePoint - 80 - EIS")
  121.     End Sub
  122. End Module

Hope it helps you.