Debugging a .Net Windows Service the "easy way"

Mark Pearce describes how to debug a .Net Windows service from Visual Studio:

To do this, you need to emulate what the Service Control Manager (SCM) does when it starts your service — in other words, invoke your service’s OnStart method. In VB, this looks like:

    ' The main entry point for the process
     _    Shared Sub Main()
#If DEBUG Then
        Dim DebugService As New ServiceAdmin
        DebugService.OnStart(Nothing)
#Else
        Dim ServicesToRun() As System.ServiceProcess.ServiceBase        ServicesToRun = New System.ServiceProcess.ServiceBase() {New ServiceAdmin()}
        System.ServiceProcess.ServiceBase.Run(ServicesToRun)
#End If
    End Sub

Cool stuff.

One caveat: if all you do in your OnStart event is start a timer, then the application will terminate immediately. You have to give it something to hold the application open while you are debugging. This is cheezy, but works:

Protected Overrides Sub OnStart(ByVal args() As String)
    Timer1.Interval = 1000
    MessageBox.Show("Click OK to stop the service.")
    Timer1.Enabled = True
End Sub

The service will run as long as the Message box stays open.