Click here to Skip to main content
Click here to Skip to main content

Creating a simple Windows Service

, 14 Sep 2010 CPOL
Rate this:
Please Sign up or sign in to vote.
This article describes how to create a simple Windows Service using MS Visual Studio.

Introduction

I'll show how to create simple Windows Service in MS Visual Studio 2010 Express using no templates.

Background

The article Creating a Windows Service in C# helped me a lot, but it wasn't perfect. After I created a Windows Service and it worked, I decided to write an article to not forget how to create Windows Services.

Using the code

Start MS Visual Studio 2010 Express and create a new empty project.

Your Solution Explorer should now look like this:

2_after_project_creation.jpg

Then you have to add two classes: WinService.cs and ServiceInstaller.cs.

The WinService class should contains this code:

namespace WinServiceProject
{
    using System;
    using System.IO;

    class WinService : System.ServiceProcess.ServiceBase
    {
        // The main entry point for the process
        static void Main()
        {
            System.ServiceProcess.ServiceBase[] ServicesToRun;
            ServicesToRun = 
              new System.ServiceProcess.ServiceBase[] { new WinService() };
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
        }
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.ServiceName = "WinService";
        }
        private string folderPath = @"c:\temp";
        /// <summary>
        /// Set things in motion so your service can do its work.
        /// </summary>
        protected override void OnStart(string[] args)
        {
            if(!System.IO.Directory.Exists(folderPath))
                System.IO.Directory.CreateDirectory(folderPath);

            FileStream fs = new FileStream(folderPath+"\\WindowsService.txt", 
                                FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter m_streamWriter = new StreamWriter(fs);
            m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
            m_streamWriter.WriteLine(" WindowsService: Service Started at " + 
               DateTime.Now.ToShortDateString() + " " + 
               DateTime.Now.ToShortTimeString() + "\n");
            m_streamWriter.Flush();
            m_streamWriter.Close();
        }
        /// <summary>
        /// Stop this service.
        /// </summary>
        protected override void OnStop()
        {
            FileStream fs = new FileStream(folderPath + 
              "\\WindowsService.txt", 
              FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter m_streamWriter = new StreamWriter(fs);
            m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
            m_streamWriter.WriteLine(" WindowsService: Service Stopped at " + 
              DateTime.Now.ToShortDateString() + " " + 
              DateTime.Now.ToShortTimeString() + "\n");
            m_streamWriter.Flush();
            m_streamWriter.Close();
        }
    }
}

This class contains two functions: OnStart and OnStop. I'll use them to show that our Windows Service is working. When the Service starts and stops, it will write a string to a file.

ServiceInstaller.cs should contain:

namespace WinServiceProject
{
    using System;

    /// <summary>
    ///     Summary description for ProjectInstaller.
    /// </summary>
    [System.ComponentModel.RunInstaller(true)]
    public class ProjectInstaller : System.Configuration.Install.Installer
    {
        /// <summary>
        ///    Required designer variable.
        /// </summary>
        //private System.ComponentModel.Container components;
        private System.ServiceProcess.ServiceInstaller serviceInstaller;
        private System.ServiceProcess.ServiceProcessInstaller 
                serviceProcessInstaller;

        public ProjectInstaller()
        {
            // This call is required by the Designer.
            InitializeComponent();
        }

        /// <summary>
        ///    Required method for Designer support - do not modify
        ///    the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.serviceInstaller = new System.ServiceProcess.ServiceInstaller();
            this.serviceProcessInstaller = 
              new System.ServiceProcess.ServiceProcessInstaller();
            // 
            // serviceInstaller
            // 
            this.serviceInstaller.Description = "My Windows Service description";
            this.serviceInstaller.DisplayName = "My WinService";
            this.serviceInstaller.ServiceName = "WinService";
            // 
            // serviceProcessInstaller
            // 
            this.serviceProcessInstaller.Account = 
              System.ServiceProcess.ServiceAccount.LocalService;
            this.serviceProcessInstaller.Password = null;
            this.serviceProcessInstaller.Username = null;
            // 
            // ServiceInstaller
            // 
            this.Installers.AddRange(new System.Configuration.Install.Installer[] {
            this.serviceProcessInstaller,
            this.serviceInstaller});

        }
    }
}

In ServiceInstaller.cs, you can specify the Service's name, description, etc.

After creating the classes, add three references: System, System.Configuration.Install, and System.ServiceProcess. When you do that, your Solution Explorer will look like this:

3_after_classes_insertion.jpg

Now your project is complete. You can build it. In the bin\Release or bin\Debug folder, you will find the file WinServiceProject.exe. This is your Windows Service.

Now we need to add our service to other Windows Services and make it work. For this, we need to use InstallUtil. I found it in C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319. The last folder shows the Framework version. In the zip file attached, there are two bat files. install.bat installs our Service. It looks like this:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\installutil.exe WinServiceProject.exe

pause

To uninstall the service, you have to use /u key with the InstallUtil utility. The second bat file named uninstall.bat looks like this:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u WinServiceProject.exe

pause

Now you have three files: WinServiceProject.exe, install.bat, and uninstall.bat. You have to now decide where your service will be. For testing and debugging purposes, I suggest you leave WinServiceProject.exe in the Debug or Release folder and copy the install.bat and uninstall.bat files so you can work in a single folder.

Notice! Before editing the project and rebuilding it, always stop your service. Otherwise you can get errors.

After you install your service, you can see it in local services:

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Andrew Muza
Software Developer
Ukraine Ukraine
Working as a software developer since 2007.
I've been working as a Salesforce Developer for more than 2 years.
Also I have good experience in C#. Have experience in Flex (AS 3), Java (J2EE, J2ME), PHP and Qt.
Follow on   Twitter   LinkedIn

Comments and Discussions

 
GeneralMy vote of 5 PinmemberMember 102163761-Apr-14 4:12 
QuestionIs this article covering for cross windows versions? PinmemberFlemming.M.Madsen22-Nov-13 3:59 
AnswerRe: Is this article covering for cross windows versions? PinmemberAndrew Muza24-Dec-13 20:37 
QuestionStep by step guide to create windows service PinmemberXaheer Ahmed6-Nov-13 1:39 
QuestionHI Pinmembersajin jalal14-Oct-13 19:27 
AnswerRe: HI PinmemberAndrew Muza24-Dec-13 20:32 
Questionthanks Pinmemberidrys29-Aug-13 5:39 
AnswerRe: thanks PinmemberAndrew Muza24-Dec-13 20:30 
QuestionBeautiful! Works as intended. PinmemberMember 102004299-Aug-13 15:55 
AnswerRe: Beautiful! Works as intended. PinmemberAndrew Muza24-Dec-13 20:29 
QuestionGreat Job - Thank You!!! PinmemberStinkyPants4-Oct-12 9:12 
SuggestionRun installutil.exe as administrator Pinmemberddas-edEn11-Sep-12 7:28 
GeneralRe: Run installutil.exe as administrator PinmemberMember 97988352-Jul-14 9:13 
GeneralMy vote of 5 Pinmemberddas-edEn11-Sep-12 3:45 
Answerthanks Pinmembermtmam16-Jul-12 5:42 
Answerthanks Pinmembermtmam16-Jul-12 5:41 
GeneralMy vote of 1 PinmemberKirill Kovalev6-Sep-10 4:07 
GeneralRe: My vote of 1 PinmemberAndrii Muza6-Sep-10 5:12 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.141216.1 | Last Updated 14 Sep 2010
Article Copyright 2010 by Andrew Muza
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid