We will study how to create an application as a Windows service. The content includes what is a Windows service and how to create, install, and debug them. The System. ServiceProcess. ServiceBase namespace class is used.
What is a Windows service?
Windows service applications are applications that require long-term running. They are especially suitable for server environments. It does not have a user interface and does not produce any visual output. Any user message is written into the Windows event log. When the computer starts, the service automatically starts running. They do not run only when users log on. They can run in any user environment including the system. Through the Service Control Manager, Windows Services are controllable and can be terminated, paused, and started as needed.
Windows Services, formerly NT services, are introduced as part of the Windows NT operating system. They are not in Windows 9x or Windows Me. You need to use an NT-level operating system to run Windows Services, such as Windows NT, Windows 2000 Professional, or Windows 2000 Server. For example, products in the form of Windows Services include Microsoft Exchange and SQL Server, and Windows Time services such as computer clock settings.
Create a Windows Service
The service we are about to create does nothing except demonstration. When the service is started, an entry is registered to a database to indicate that the service has been started. During service running, it regularly creates a database project record at a specified interval. When the service is stopped, the last database record is created. This service automatically registers with the Windows Application log the records when it is successfully started or stopped.
Visual Studio. NET makes creating a Windows Service quite simple. The following describes how to start the demo service program.
1. Create a project
2. Select a Windows service from the list of available project templates
3. The designer opens in design mode.
4. Drag a Timer object from the component table in the toolbox to the design surface (Note: Make sure that Timer is used from the component list rather than from the Windows form List)
5. Set the Timer attribute. The Enabled attribute is False, and the Interval attribute is 30000 milliseconds.
6. Switch to the Code view page (Press F7 or select code from the View menu) and fill in the function for this service.
Composition of Windows Services
In the code behind your class, you will notice that the Windows Service you created expands the System. ServiceProcess. Service class. All Windows Services created in. NET mode must expand this class. It requires your service to reload the following methods. Visual Studio includes these methods by default.
• Dispose-clear any managed and unmanaged resources)
• OnStart-Control Service Startup
• OnStop-Control Service stop
Database Table script sample
The database tables used in this example are created using the following T-SQL script. Select the SQL Server database. You can easily modify this example so that it can run in Access or any database you choose.
Create table [dbo]. [MyServiceLog] (
[In_LogId] [int] IDENTITY (1, 1) not null,
[Vc_Status] [nvarchar] (40)
COLLATE SQL _Latin1_General_CP1_CI_AS NOT NULL,
[Dt_Created] [datetime] NOT NULL
) ON [PRIMARY]
Windows service example
The following is all the source code of the Windows service named MyService. Most source code is automatically generated by Visual Studio.
Code
Using System;
Using System. Collections;
Using System. ComponentModel;
Using System. Data;
Using System. Data. SqlClient;
Using System. Diagnostics;
Using System. ServiceProcess;
Namespace CodeGuru. MyWindowsService
{
Public class MyService: System. ServiceProcess. ServiceBase
{
Private System. Timers. Timer timer1;
/// <Remarks>
/// Required designer variable.
/// </Remarks>
Private System. ComponentModel. Container components = null;
Public MyService ()
{
// This call is required by the Windows. Forms
// Component Designer.
InitializeComponent ();
}
// The main entry point for the process
Static void Main ()
{
System. ServiceProcess. ServiceBase [] ServicesToRun;
ServicesToRun = new System. ServiceProcess. ServiceBase []
{New MyService ()};
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. timer1 = new System. Timers. Timer ();
(System. ComponentModel. ISupportInitialize)
(This. timer1). BeginInit ();
//
// Timer1
//
This. timer1.Interval = 30000;
This. timer1.Elapsed + =
New System. Timers. ElapsedEventHandler (this. timer1_Elapsed );
//
// MyService
//
This. ServiceName = "My Sample Service ";
(System. ComponentModel. ISupportInitialize)
(This. timer1). EndInit ();
}
/// <Summary>
/// Clean up any resources being used.
/// </Summary>
Protected override void Dispose (bool disposing)
{
If (disposing)
{
If (components! = Null)
{
Components. Dispose ();
}
}
Base. Dispose (disposing );
}
/// <Summary>
/// Set things in motion so your service can do its work.
/// </Summary>
Protected override void OnStart (string [] args)
{
This. timer1.Enabled = true;
This. LogMessage ("Service Started ");
}
/// <Summary>
/// Stop this service.
/// </Summary>
Protected override void OnStop ()
{
This. timer1.Enabled = false;
This. LogMessage ("Service Stopped ");
}
/*
* Respond to the Elapsed event of the timer control
*/
Private void timer1_Elapsed (object sender,
System. Timers. ElapsedEventArgs e)
{
This. LogMessage ("Service Running ");
}
/*
* Log specified message to database
*/
Private void LogMessage (string Message)
{
SqlConnection connection = null;
SqlCommand command = null;
Try
{
Connection = new SqlConnection (
"Server = localhost; Database = SampleDatabase; Integrated
Security = false; User Id = sa; Password = ;");
Command = new SqlCommand (
"Insert into MyServiceLog (vc_Status, dt_Created)
VALUES ('"+ Message +"', getdate () ", connection );
Connection. Open ();
Int numrows = command. ExecuteNonQuery ();
}
Catch (Exception ex)
{
System. Diagnostics. Debug. WriteLine (ex. Message );
}
Finally
{
Command. Dispose ();
Connection. Dispose ();
}
}
}
}
Install Windows Services
Windows Services are different from common Windows applications. It is impossible to simply start the Windows service by running an EXE. To install a Windows service, you must use installutil.exe of. NET framework.exe, or use a file deployment project such as Microsoft Installer (MSI.
Add service Installer
It is not enough to create a Windows Service and only use the InstallUtil program to install the service. You must add a service installer to your Windows Service so that InstallUtil or any other installer can know how your service is configured.
1. Switch the service program to the design view.
2. Right-click the design view and select "add installer"
3. Switch to the design view of the newly added ProjectInstaller.
4. Set the attributes of the serviceInstaller1 component:
1) ServiceName = My Sample Service
2) StartType = Automatic
5. Set the attributes of the serviceProcessInstaller1 component
1) Account = LocalSystem
6. Generate a solution
After completing the preceding steps, Visual Studio automatically generates the following source code, which is included in the source file ProjectInstaller. cs.
Code
Using System;
Using System. Collections;
Using System. ComponentModel;
Using System. Configuration. Install;
Namespace CodeGuru. MyWindowsService
{
/// <Summary>
/// Summary description for ProjectInstaller.
/// </Summary>
[RunInstaller (true)]
Public class ProjectInstaller:
System. Configuration. Install. Installer
{
Private System. ServiceProcess. ServiceProcessInstaller
ServiceProcessInstaller1;
Private System. ServiceProcess. ServiceInstaller serviceInstaller1;
/// <Summary>
/// Required designer variable.
/// </Summary>
Private System. ComponentModel. Container components = null;
Public ProjectInstaller ()
{
// This call is required by the Designer.
InitializeComponent ();
// TODO: Add any initialization after the InitComponent call
}
# Region Component Designer generated code
/// <Summary>
/// Required method for Designer support-do not modify
/// The contents of this method with the code editor.
/// </Summary>
Private void InitializeComponent ()
{
This. serviceProcessInstaller1 = new
System. ServiceProcess. ServiceProcessInstaller ();
This. serviceInstaller1 = new
System. ServiceProcess. ServiceInstaller ();
//
// ServiceProcessInstaller1
//
This. serviceProcessInstaller1.Account =
System. ServiceProcess. ServiceAccount. LocalSystem;
This. serviceProcessInstaller1.Password = null;
This. serviceProcessInstaller1.Username = null;
//
// ServiceInstaller1
//
This. serviceInstaller1.ServiceName = "My Sample Service ";
This. serviceInstaller1.StartType =
System. ServiceProcess. ServiceStartMode. Automatic;
//
// ProjectInstaller
//
This. Installers. AddRange (new
System. Configuration. Install. Installer []
{This. serviceProcessInstaller1, this. serviceInstaller1 });
}
# Endregion
}
}
Install Windows Services with InstallUtil
Now that this service has been generated, you need to install it to use it. The following operations will guide you to install your new service.
1. Prompt for opening the Visual Studio. NET command
2. Change the path to the bin \ Debug folder of your project (if you compile in Release mode, in the bin \ Release folder)
3. Execute the command "installutil.exe MyWindowsService.exe" to register this service and create an appropriate registration item.
4. Right-click "my computer" on the desktop and select "manage" to access the computer management console.
5. In the "services" section of "services and applications", you can find that your Windows services are included in the Service list.
6. Right-click your service and choose start to start your service.
Every time you need to modify the Windows Service, this requires you to uninstall and reinstall the service. However, it is a good habit to ensure that the service management console is closed before you uninstall the service. If this is not the case, you may encounter problems when uninstalling and re-installing Windows Services. If you only uninstall the service, you can run the InstallUtil command to log out of the service. However, you need to add a/u command to the end.
Debug Windows Services
From another perspective, debugging Windows Services is totally different from a common application. More steps are required to debug Windows Services. Services cannot be debugged as long as they are simply executed in the development environment as you do for common applications. The service must be installed and started first. We have done this in the previous section. To facilitate code tracing and debugging, once the service is started, you must use Visual Studio to append the running process (attach ). Remember, any modifications made to your Windows service must be uninstalled and reinstalled.
Append a running Windows Service
To debug the program, some operating instructions for the Windows Service are attached. These operations assume that you have installed the Windows service and it is running.
1. Use Visual Studio to load this project
2. Click the "debug" menu
3. Click the process menu.
4. Ensure that the system process is selected
5. In the list of available processes, locate the process on your Executable File Name and click to select it
6. Click the Add button.
7. Click OK.
8. Click Close.
9. Set a breakpoint in the timerreceivelapsed method and wait for it to execute
Summary
Now you should have a rough understanding of what Windows Services are and how to create, install, and debug them. You can study the functions of Windows Services on your own. These functions include OnPause and OnContinue. The pause and resume capabilities are not enabled by default. You must set them through Windows Service properties.