Running a Windows Service as a Console Application
Posted on May 18, 2012 • 2 minutes • 402 words
Table of contents
Edit: Nowadays I would recommend TopShelf . It provides a simple framework for a Windows Service that’s easy to debug, install, uninstall, etc.
Introduction
If you have ever built a Windows Service then trying to debug it can be a problem, having to attach the debugger to a running process is not ideal and I like having the ability to just click “play”.
Therefore, with a few changes to a Windows Service, it can be set to run as a console application within Visual Studio for debugging but is actually a Windows Service.
For this to work I am assuming a single service within the same process, if multiple services exist then a different solution will be needed
Steps
- Change the Application type in the Project properties to a “Console Application” and the Startup object to “Sub Main”.
-
Search the project for “Sub Main” - it is within the main Service1.Designer.vb file.
-
The automatic created code should look like this
' The main entry point for the process <MTAThread()> \_ <System.Diagnostics.DebuggerNonUserCode()> \_ Shared Sub Main() Dim ServicesToRun() As System.ServiceProcess.ServiceBase ' More than one NT Service may run within the same process. To add ' another service to this process, change the following line to ' create a second service object. For example, ' ' ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService} ' ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service1} System.ServiceProcess.ServiceBase.Run(ServicesToRun) End Sub
-
Now this needs editing to create the single service object, then start it. For example:
' The main entry point for the process <MTAThread()> \_ <System.Diagnostics.DebuggerNonUserCode()> \_ Shared Sub Main() Dim serviceToRun As Service1 = New Service1 If Environment.UserInteractive Then serviceToRun.OnStart(Nothing) Console.WriteLine("Press any key to stop the service") Console.Read() serviceToRun.OnStop() Else ServiceBase.Run(serviceToRun) End If End Sub
Key Things
In the modified code I am doing a few key things:
-
Creating the single service:
Dim serviceToRun As Service1 = New Service1
in place of the line below that creates an array with one instance:
ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service1}
-
Added an if statement based on “Environment.UserInteractive” that will be true for when running in Visual Studio.
If Environment.UserInteractive Then
-
If it’s within Visual Studio then the code just starts the service by calling the start sub and then waiting until a Console input.
serviceToRun.OnStart(Nothing) Console.WriteLine("Press any key to stop the service") Console.Read() serviceToRun.OnStop()
-
If not within Visual Studio then it runs the original code to run the service:
ServiceBase.Run(serviceToRun)