Services With Topshelf

When building software systems, at some point or another you’ll have a need to create a Windows service. Usually the development process of creating a service looks like this: build a console application that does the processing in a loop, test the application, then copy the code into a new service project and deploy as a Windows service to production. If there is any additional debugging to be done or features to add, start the process over. This cycle was so painful that I began avoiding services altogether when in the design stage.

All that changed when I learned about Topshelf (opens new window). Topshelf is a framework for .NET that makes it incredibly easy to build and deploy Windows services. With Topshelf, you can build and test the service as a console application. When it comes time for deployment, you can install the same .exe as a service from the command line. The transition from development to production is seamless. If you’ve developed Windows services the traditional way, developing with Topshelf for the first time seems almost magical.

The code examples (opens new window) on their site are very good, so I won’t bother writing my own example here. Open up the Package Manager Console in Visual Studio and run the following nuget command to get started:

Install-Package Topshelf

With Topshelf, you can configure your service with any settings just like you would when traditionally developing a Windows service. This includes running under another Windows account, starting automatically or manually, and service name and description details.

If you plan on using NLog for logging functionality, just call .UseNLog when initializing your host factory. You’ll also need to have NLog and the config package installed.

Install-Package NLog
Install-Package Nlog.Config

About Me

Hi, I'm Dominic 👋 I'm a software engineer building front-end web apps, back-end services, and some things in between. I most enjoy working with TypeScript and .NET (6+/Core). Check out some of my projects, or get in touch.