Click here to Skip to main content
15,886,017 members
Articles / Programming Languages / C#

Creating a simple Windows Service

Rate me:
Please Sign up or sign in to vote.
4.89/5 (30 votes)
14 Sep 2010CPOL2 min read 248K   9.5K   59   25
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.

Image 1

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:

C#
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:

C#
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:

Image 4

License

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


Written By
Software Developer
Belarus Belarus
I'm Certified Force.com Developer, who have been building custom solutions using Force.com platform for last 4 years. This involves coding classes (batches, scheduled classes, email handlers), triggers and Visualforce pages (with Javascript, jQuery and CSS); adding/customizing standard and custom object. Mostly, I work on integration solutions.
(key words: Force.com, Salesforce, sObject, Apex, batch, trigger, governor limits, SOQL, Visualforce, integration, REST, Force.com IDE, Git)

Before Salesforce, for 4 years, I participated in application development using C#, Java, PHP, Qt and Action Script. Mostly, MS SQL and MySQL were used as data storage for applications.

Comments and Discussions

 
QuestionYou can help me? Pin
naser.najafiazar24-May-15 5:20
naser.najafiazar24-May-15 5:20 
AnswerRe: You can help me? Pin
Andrew Muza24-Jun-15 3:18
professionalAndrew Muza24-Jun-15 3:18 
GeneralRe: You can help me? Pin
Member 1186868528-Jul-15 2:18
Member 1186868528-Jul-15 2:18 
GeneralRe: You can help me? Pin
Andrew Muza24-Nov-15 3:37
professionalAndrew Muza24-Nov-15 3:37 
GeneralMy vote of 5 Pin
Member 102163761-Apr-14 3:12
Member 102163761-Apr-14 3:12 
GeneralRe: My vote of 5 Pin
Andrew Muza24-Jun-15 3:20
professionalAndrew Muza24-Jun-15 3:20 
QuestionIs this article covering for cross windows versions? Pin
Flemming.M.Madsen22-Nov-13 2:59
Flemming.M.Madsen22-Nov-13 2:59 
AnswerRe: Is this article covering for cross windows versions? Pin
Andrew Muza24-Dec-13 19:37
professionalAndrew Muza24-Dec-13 19:37 
QuestionStep by step guide to create windows service Pin
Xaheer Ahmed6-Nov-13 0:39
Xaheer Ahmed6-Nov-13 0:39 
QuestionHI Pin
sajin jalal14-Oct-13 18:27
sajin jalal14-Oct-13 18:27 
I had installed the service using installutil.exe , but i couldnt find the service in local services..
could you tell me what am i doing wrong
AnswerRe: HI Pin
Andrew Muza24-Dec-13 19:32
professionalAndrew Muza24-Dec-13 19:32 
Questionthanks Pin
idrys29-Aug-13 4:39
idrys29-Aug-13 4:39 
AnswerRe: thanks Pin
Andrew Muza24-Dec-13 19:30
professionalAndrew Muza24-Dec-13 19:30 
QuestionBeautiful! Works as intended. Pin
Member 102004299-Aug-13 14:55
Member 102004299-Aug-13 14:55 
AnswerRe: Beautiful! Works as intended. Pin
Andrew Muza24-Dec-13 19:29
professionalAndrew Muza24-Dec-13 19:29 
QuestionGreat Job - Thank You!!! Pin
StinkyPants4-Oct-12 8:12
StinkyPants4-Oct-12 8:12 
SuggestionRun installutil.exe as administrator Pin
ddas-edEn11-Sep-12 6:28
ddas-edEn11-Sep-12 6:28 
GeneralRe: Run installutil.exe as administrator Pin
zarzoc2-Jul-14 8:13
zarzoc2-Jul-14 8:13 
GeneralMy vote of 5 Pin
ddas-edEn11-Sep-12 2:45
ddas-edEn11-Sep-12 2:45 
Answerthanks Pin
mtmam16-Jul-12 4:42
mtmam16-Jul-12 4:42 
Answerthanks Pin
mtmam16-Jul-12 4:41
mtmam16-Jul-12 4:41 
GeneralMy vote of 1 Pin
NeoPunk6-Sep-10 3:07
NeoPunk6-Sep-10 3:07 
GeneralRe: My vote of 1 PinPopular
Andrew Muza6-Sep-10 4:12
professionalAndrew Muza6-Sep-10 4:12 
GeneralRe: My vote of 1 Pin
Heriberto Lugo25-Jan-15 19:56
Heriberto Lugo25-Jan-15 19:56 

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

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