آموزش ساخت ویندوز سرویس (Windows Service) و Installer آن
سرویس های ویندوز نوعی ویندوز اپلیکیشن هستند که در فضای جداگانه ای اجرا می شوند ، این سرویس ها به صورت پشت پرده و در هنگام بارگزاری ویندوز اجرا می شوند . معمولا برای انجام عملیات دوره ای در زمان های پی در پی از این سرویس ها به کمک یک Timer استفاده می شود .
در حقیقت شما میتوانید برای عملیاتی که نیاز است به صورت دوره ای به بانک اطلاعات وصل شده و یک سری عملیات را انجام دهید از این سرویس ها استفاده نمایید ، به عنوان مثال شما قصد دارید به هر کاربری که اعتبارش از 500 ریال کمتر شد یک ایمیل بفرستید ، این کار به سادگی از طریق سرویس های ویندوز قابل پیاده سازی است .
روش کار به این صورت است که یک ویندوز سرویس ایجاد می کنید ، در آن یک Timer قرار داده که مثلا هر 1 ساعت یکبار دیتابیس کاربران را چک نماید و لیست کاربرانی که اعتبار آن ها از 500 ریال کمتر است واکشی کند ، پس از واکشی ، با یک حلقه به همه آن ها ایمیل ارسال می شود .
خوب بهتر است از تئوری خارج شده و این کار را به صورت عملی انجام دهیم .
ساختن ویندوز سرویس را در دو مرحله پی می گیریم :
1- ایجاد ویندوز سرویس (Windows Service)
2- ایجاد نصّاب ویندوز سرویس (Windows Service Installer)
در تمام طول این آموزش خواهشمندم مرحله به مرحله جلو رفته تا مشکلی در هنگام اجرا رخ ندهد ، در صورت بروز هر گونه مشکل میتوانید مشکل خود را در بخش پرسش و پاسخ سایت مطرح نمایید .
1- ایجاد ویندوز سرویس (Windows Service)
برای اضافه کردن یک Windows Service نرم افزار Visual Studio.NET را گشوده و سپس وارد منوی File > New > Project شوید ،از آیتم های سمت چپ زبان مورد نظرتان را انتخاب کنید (Visual #C یا Visual Basic) کرده و + را کلیک کنید تا شاخه مربوط باز شود ، آیتم Windows را انتخاب نمایید و سپس از سمت راست گزینه Windows Service را برگزینید ، یک نام دلخواه برای آن انتخاب کرده و دکمه OK را کلیک نموده تا پروژه ایجاد شود .
به صورت پیشفرض یک آیتم به نام Service1 در Solution Explorer وجود دارد ، این آیتم را حذف نموده و سپس وارد منوی Project > Add New Item شده و سپس یک آیتم از نوع Windows Service با نام دلخواه خود اضافه نمایید (البته میتوانید فایل Service1 را هم به نام دلخواه Rename نمایید )
دقت نمایید پس از اضافه نمودن آیتم با نام دلخواه (مثلا YourName) باید وارد کلاس program شده و نام Service1 را به این نام تغییر دهید (برای #C نویس ها)
ما قصد داریم یک سرویس ایجاد کنیم که در زمان های متوالی یک سری اعمال بانک اطلاعاتی را انجام دهد ، بنابراین واضح است که به یک تایمر نیاز داریم ، اگر با Windows Application آشنایی داشته باشید میدانید که استفاده از تایمر بسیار سادست کافیست یک کنترل از نوع تایمر در صفحه قرار داده و خاصیت interval آن را ست نمایید اما متاسفانه شما نمیتوانید از این کنترل در Windows Service ها استفاده کنید ، این یکی از کلیدی ترین نکات ساخت سرویس های ویندوز است . بنابراین برای اضافه نمودن تایمر به صورت زیر عمل نمایید :
1- روی صفحه کلیک راست کرده و آیتم View Code را انتخاب نمایید تا بخش Code-Behind نمایش داده شود ، احتمالا کدی مشابه زیر ملاحظه خواهید کرد :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
namespace ConcatenateService
{
partial class Concatenate : ServiceBase
{
public Concatenate()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
// TODO: Add code here to start your service.
}
protected override void OnStop()
{
// TODO: Add code here to perform any tear-down necessary to stop your service.
}
}
}
2- یک متغیر Global از نوع Timer به کلاس فوق اضافه نمایید :
System.Timers.Timer myTimer = new System.Timers.Timer();
3- در رویداد OnStart ابتدا تایمر را فعال کرده و سپس مقدار Interval (دوره بازگشت تایمر) را تعیین نمایید ، و سپس رویداد اجرا شدن هر دوره را به Timer نسبت می دهیم .
protected override void OnStart(string[] args)
{
myTimer.Interval = 1000;
myTimer.Enabled = true;
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
}
void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// واکشی داده از بانک اطلاعاتی
//عملیات مورد نظر بر روی داده ها در یک حلقه
}
نکته : خاصیت Interval از نوع int32 بوده و بر حسب میلی ثانیه می باشد ، بنابراین اگر میخواهید دوره هر 1 دقیق یکبار انجام شود باید مقدار 60000 را ست نمایید .
3- کد های مربوط به ارتباط با بانک اطلاعاتی ، واکشی داده ها و عملیات مورد نظر را در تابع myTimer_Elapsed مینویسیم .
4- در رویداد OnStop تایمر را غیر فعال می کنیم :
protected override void OnStop()
{
myTimer.Stop();
}
ویندوز سرویس شما آماده است ، در نهایت کد ها چیزی شبیه کد های زیر خواهد بود :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
namespace ConcatenateService
{
partial class Concatenate : ServiceBase
{
System.Timers.Timer myTimer = new System.Timers.Timer();
public Concatenate()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
myTimer.Interval = 1000;
myTimer.Enabled = true;
myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
}
void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// واکشی داده از بانک اطلاعاتی
//عملیات مورد نظر بر روی داده ها در یک حلقه
}
protected override void OnStop()
{
myTimer.Stop();
}
}
}
2- ایجاد نصّاب ویندوز سرویس (Windows Service Installer)
همانطور که ملاحظه کردید ساختن یک Windows Service بسیار راحت بود ، البته یک نکته ظریف در مورد تایمر ها وجود داشت که به آن اشاره کردیم .
در این بخش به ساخت Installer برای سرویس می پردازیم که معمولا برای خیلی ها جای سوال است .
برای ساخت Installer ابتدا کلاس سرویس به صورت زیر عمل نمایید :
1- ویندوز سرویسی که ایجاد کرده اید را باز نمایید .
2- در همان صفحه Design روی صفحه کلیک راست کرده و گزینه Add Installer را انتخاب نمایید
3- به صورت خودکار یک آیتم به نام ProjectInstaller به صفحه اضافه خواهد شد که داخل آن دو شی serviceProcessInstaller1 و serviceInstaller1 قرار دارد .
4- پیشنهاد می کنم در همین ابتدای کار نام این دو شی را تغییر دهید ، مثلا YourrNameProccessInstaller و YourNameInstaller ، مزیت این کار این است که در هنگام نصب سرویس نام آن را ملاحظه می کنید و همچنین با نصب چند سرویس نام ها تلاقی پیدا نمی کنند
5- روی شی ProccessInstaller کلیک راست کرده و گزینه Properties را انتخاب کنید ، خاصیت Account را به LocalSytem تغییر دهید
6- روی شی Installer کلیک راست کرده و گزینه Properties را انتخاب کنید ، خاصیت StatType را Automatic قرار دهید
7- عمل Save را انجام داده و پروژه را یک بار Rebuild نمایید
8- وارد منوی File > Add > New Project شده و از سمت چپ گزینه Other Project Types و سپس گزینه Setup And Deployment را انتخاب کنید ، از آیتم های سمت راست Setup Project را انتخاب کرده و یک نام دلخواه (مثلا YourNameSetup) به آن نسبت داده و دکمه OK را بفشارید تا پروژه Setup اضافه شود .
9- در صفحه باز شده از سمت چپ روی گزینه Application Folder کلیک راست کرده و گزینه Add > Project Output را انتخاب کنید ، در صفحه باز شده از لیست Project ، پروژه ویندوز سرویس خود را انتخاب نمایید و سپس دکمه OK را بفشارید .
10 - از داخل Solution Explorer روی پروژه Setup که اضافه کردیم (YourNameSetup) کلیک راست کرده و گزینه View > Custom Actions را انتخاب نمایید ، در صفحه باز شده بر روی گزینه Install کلیک راست کرده و گزینه Add Custom Actions را برگزینید ، سپس در صفحه جاری Application Folder را گشوده و فایل داخل آن (...Primary Output) را انتخاب نمایید .
11- عمل شماره 10 را برای سه گزینه دیگر یعنی Commit , RollBack و Unistall هم انجام دهید
12- کل پروژه را یکبار ReBuild نمایید .
کار تمام است فایل Setup شما آمادست ، کافیست آنرا از پوشه Bin > Debug محل پروژه YourNameSetup بردارید و در هرجا که خواستید نصب نمایید .
برای Stop , Start و همچنین Restart کردن سرویس ها و همچنین Unistall کردن آن وارد Control Panel > Administrative Tools > Services شده ، ویندوز سرویس خود را پیدا کرده و عملیات مورد نظر را انجام دهید .
موفق و پیروز باشید