آموزش windows service

آموزش windows service

بسم الله الرحمن الرحیم

در طراحی و ساخت نرم افزارهای تحت Windows شما می توانید به روش های مختلف نرم افزار خود را تولید کنید. ممکن است در طراحی برخی از نرم افزارها، شما نیاز داشته باشید از هنگام اجرا شدن Windows برنامه شما شروع به کار کند.

یکی از ساده ترین روش های ممکن برای انجام این کار قراردادن نرم افزار در بخش Start up می باشد. اما ممکن است شما بخواهید نرم افزار خود را به عنوان یک برنامه پس زمینه، بدون اینکه کاربر در اجرای آن دخیل باشد اجرا کنید و یا اینکه مانند بسیاری از Processهای ویندوز، پس از اجرای ویندوز برنامه شما اجرا شود. معمولا برای انجام این کار از روشی استفاده می کنند که بر اساس آن برنامه شما در بخش Services ویندوز اضافه می شود.

 

این روش طبیعتا روش حرفه ای تر نسبت به روش قراردادن نرم افزار در بخش Start up می باشد. معمولا برنامه هایی که نیاز دارند به صورت Lifetime و همیشگی در حال اجرا باشند به صورت یک Service به ویندوز اضافه می شوند. برای ساخت پروژه هایی که قرار است به عنوان Service در Windows تعریف شوند، می توانید از طریق Microsoft Visual Studio نوع Windows Service Application را انتخاب کنید.

آموزش ویندوز سرویس در سی شارپ

در این آموزش قصد داریم شما را با روش طراحی یک پروژه به صورتWindows Service Application  آشنا کنیم. برای شروع ویژوال استادیو خود را باز کنید و از قسمت #Visual C و گزینه Windows را انتخاب کنید. حال از قسمت میانی صفحه گزینه Windows Service را انتخاب کنید.

توجه داشته باشید این آموزش بر اساس Visual Studio 2013 می باشد و در نسخه 5 Visual Studio 201شما نمی توانید پروژه های از نوع Windows Service ایجاد کنید، در انتهای همین مقاله روش حل این مشکل را نیز آموزش داده ایم.

بسم الله الرحمن الرحیم

در طراحی و ساخت نرم افزارهای تحت Windows شما می توانید به روش های مختلف نرم افزار خود را تولید کنید. ممکن است در طراحی برخی از نرم افزارها، شما نیاز داشته باشید از هنگام اجرا شدن Windows برنامه شما شروع به کار کند.

یکی از ساده ترین روش های ممکن برای انجام این کار قراردادن نرم افزار در بخش Start up می باشد. اما ممکن است شما بخواهید نرم افزار خود را به عنوان یک برنامه پس زمینه، بدون اینکه کاربر در اجرای آن دخیل باشد اجرا کنید و یا اینکه مانند بسیاری از Processهای ویندوز، پس از اجرای ویندوز برنامه شما اجرا شود. معمولا برای انجام این کار از روشی استفاده می کنند که بر اساس آن برنامه شما در بخش Services ویندوز اضافه می شود.

 

این روش طبیعتا روش حرفه ای تر نسبت به روش قراردادن نرم افزار در بخش Start up می باشد. معمولا برنامه هایی که نیاز دارند به صورت Lifetime و همیشگی در حال اجرا باشند به صورت یک Service به ویندوز اضافه می شوند. برای ساخت پروژه هایی که قرار است به عنوان Service در Windows تعریف شوند، می توانید از طریق Microsoft Visual Studio نوع Windows Service Application را انتخاب کنید.

آموزش ویندوز سرویس در سی شارپ

در این آموزش قصد داریم شما را با روش طراحی یک پروژه به صورتWindows Service Application  آشنا کنیم. برای شروع ویژوال استادیو خود را باز کنید و از قسمت #Visual C و گزینه Windows را انتخاب کنید. حال از قسمت میانی صفحه گزینه Windows Service را انتخاب کنید.

توجه داشته باشید این آموزش بر اساس Visual Studio 2013 می باشد و در نسخه 5 Visual Studio 201شما نمی توانید پروژه های از نوع Windows Service ایجاد کنید، در انتهای همین مقاله روش حل این مشکل را نیز آموزش داده ایم.

 

نام پروژه را ABLY Windows Service قرار می دهیم و سپس بر روی گزینه Ok کلیک می کنیم. حال پنجره ای مانند پنجره زیر نمایش داده می شود.

از قسمت Solution Explorer بر روی فایل Service1.cs دابل کلیک کنید و فایل مربوطه را باز کنید.

 

همانطور که در کد بالا مشاهده می کنید در این فایل دو متد OnStrat و OnStop وجود دارد. هر سرویس در دو حالت می تواند قرارگیرد. کدهایی که نیاز دارید در زمان Strat بودن Process اجرا شوند باید طبیعتا در قسمت OnStrat و کدهایی که نیاز دارید در زمان متوقف بودن برنامه اجرا شوند باید در قسمت OnStop نوشته شوند.

در این آموزش قصد داریم یک سرویس Log ساده ایجاد کنیم که در هر دقیقه در صورت اجرا بودن Service یک خط متن را در یک فایل txt اضافه می کند. همچنین در صورت متوقف بودن سرویس، یک خط به عنوان پیام متوقف شدن سرویس به فایل اضافه می کند و طبیعتا برنامه متوقف خواهد شد.

ابتدا به درون کلاس Service1 می رویم، در آنجا یک timer تعریف کنیم و سپس درون متد OnStart کد این Timer را به صورت زیر اضافه می کنیم.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace ABLY_Windows_Service
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        Timer timer;

        protected override void OnStart(string[] args)
        {
            timer = new Timer();
            timer.Interval = 1000*60; /*one minute */
            timer.Elapsed += new ElapsedEventHandler(timer_tick);
            timer.Enabled = true;
        }

        protected override void OnStop()
        {
           
        }
    }

}

تابعی را برای نوشتن Loل در یک فایل به صورت زیر تعریف می کنیم.

private void WriteLog(string message)
{
    using (StreamWriter writer = new StreamWriter("E:\\Ably-Service-Log.txt",true))
    {
        writer.WriteLine(message);
    }
}

حال باید متد Timer را که در کد بالا تعریف کردیم به صورت زیر ایجاد کنیم.

private void timer_tick(object sender, ElapsedEventArgs e)
{
    WriteLog("The Service is Running...." + DateTime.Now);
}

همانطور که می دانید به دلیل نوشته شدن کد Timer درون متد Onstart، پس از اجرا شدن سرویس کد Timer هر دقیقه یک بار اجرا می شود. درون کد Timer نیز به ازای هر بار اجرا شدن یک خط Log به فایل ما اضافه می شود.

حال باید درون متد OnStop کد متوقف شدن برنامه و در واقع کد متوقف شدن Timer را اضافه کنیم، که کد ما به صورت زیر خواهد بود.

protected override void OnStop()
{
    WriteLog("The Service has been stoped...." + DateTime.Now);
    timer.Enabled = false;
}

کل کد برنامه شما باید به صورت زیر باشد

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace ABLY_Windows_Service
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        Timer timer;

        protected override void OnStart(string[] args)
        {
            timer = new Timer();
            timer.Interval = 1000*60; /*one minute */
            timer.Elapsed += new ElapsedEventHandler(timer_tick);
            timer.Enabled = true;
        }

        protected override void OnStop()
        {
            WriteLog("The Service has been stoped...." + DateTime.Now);
            timer.Enabled = false;
        }
        private void timer_tick(object sender, ElapsedEventArgs e)
        {
           
            WriteLog("The Service is Running...." + DateTime.Now);
        }

        private void WriteLog(string message)
        {
            using (StreamWriter writer = new StreamWriter("E:\\Ably-Service-Log.txt",true))
            {
                writer.WriteLine(message);
            }
        }

    }

}

کد نویسی ما در این مرحله به پایان می رسد. حال باید برنامه خود را برای اجرا شدن در لیست سرویس های ویندوز آماده کنیم.

ابتدا بر روی Service1.cs کلیک راست کنید و سپس بر روی گزینه Add Installer کلیک کنید. حال اگر توجه کنید یک فایل جدید با نام ProjectInstaller.cs ایجاد می شود.

بر روی فایل serviceInstaller1 کلیک راست کنید و گزینه Properties را انتخاب کنید.

در این بخش شما می توانید نوع اجرا شدن سرویس (Manual , Automatic) را به همراه نام سرویس انتخاب کنید.

بر روی serviceProcessInstaller1 راست کلیک کنید و سپس از قسمت Properties مقدار گزینه Account را به LocalSystem تغییر دهید.

 

حال پروژه خود را Build کنید، در مسیر ساخت پروژه، در پوشه Debug فایل exe شما قابل دسترسی است.

نصب ویندوز سرویس

پروژه های از نوع Service Application را نمی توانید مانند سایر پروژه ها Run کنید. باید ابتدا فایل اجرایی پروژه خود را به بخش Service های Windows اضافه کنید. برای انجام اینکار می بایست از ابزار InstallUtil.exe استفاده کنید.

ابتدا برنامه Developer Command Prompt که در مسیر نصب Visual Studio وجود دارد، اجرا کنید. حتما بر روی Developer Command Prompt کلیک راست کنید و از طریق گزینه Run Administrator برنامه را اجرا کنید.

 

از طریق دستور cd به مسیر محل قرارگیری پروژه خود بروید. در این مثال آدرس ما به صورت زیر است

C:\Users\Esmaeil\Desktop\Windows Service\ABLY Windows Service\ABLY Windows Service\bin\Debug

برای تغییر مسیر ابتدا آدرس درایو خود را بنویسید و Enter کنید، سپس با استفاده از دستور CD مسیر فایل اجرایی پروژه خود را مشخص کنید.

 

 

با استفاده از دستور InstallUtil.exe می توانید یک برنامه را به Service های Windows اضافه کنید برای استفاده از این دستور می بایست به صورت زیر عمل کنید.

InstallUtil.exe "ProgramName.exe"

به جای ProgramName نام فایل اجرایی برنامه خود را باید بنویسید که در اینجا ABLy Windows Service می باشد.

حال Enter را بزنید تا دستور شما اجرا شود. پیام موفقیت آمیز بودن به صورت زیر نمایش داده می شود. اگر نتواسنتید سرویس خود را به Service های Windows اضافه کنید و با خطا مواجه شدید، این مقاله را تا پایان ادامه بدهید تا با روش های دیگر اضافه کردن سرویس به Windows Service آشنا شوید.

 

 

 

 

در صورتی که با خطا مواجه شدید طبیعتا بهترین راه حل خواندن متن خطا و یافتن علت آن می باشد، یکی از دلایل اصلی وقوع خطا نداشتن مجوز های لازم برای اضافه کردن یک برنامه به لیست Service های ویندوز می باشد که علت آن ممکن است آنتی ویروس شما و یا Administrator نبودن user شما باشد.

در اینجا سرویس شما می بایست به لیست سرویس های Windows اضافه شده باشد. برای اجرا شدن سرویس بر روی سرویس خود راست کلیک کنید و سپس گزینه Start را انتخاب کنید.

 

 

به مسیر پروژه می رویم و فایل Log خود را بررسی می کنیم. همانطور که مشاهده می کنید به ازای گذشت هر دقیقه از زمان اجرا شدن سرویس، یک خط به فایل ما اضافه شده است. برای تست متد OnStop نیز می توانیم، سرویس خود را متوقف کنیم. مشاهده خواهید کرد که خط مربوط به متوقف شدن سرویس به فایل Log نیز اضافه شده است.

The Service is Running....11/7/2015 9:35:06 PM
The Service is Running....11/7/2015 9:36:06 PM
The Service is Running....11/7/2015 9:37:06 PM
The Service has been stoped....11/7/2015 9:37:51 PM

در صورتی که تمایل دارید، سرویس خود را نیز از لیست سرویس های ویندوز حذف کنید می توانید مجددا از طریق Developer Command Prompt این کار را انجام دهید. برای این کار مانند اضافه کردن یک سرویس همه ی مراحل را انجام دهید و تنها در مرحله ی آخر به همراه دستور installUtill عبارت /u ر استفاده کنید. در این جا کد ما به صورت زیر خواهد بود.

 

InstallUtil.exe /u “ABLY windows Service.exe”

مشکلات Windows Service

چند نکته در ارتباط با Windows Service Application وجود دارد.

1- شما برای اضافه کردن این سرویس به Windows Service نیاز به ابزارها Visual Studio دارید، در نتیجه شما باید بر روی سرور خود نیز ابزارهای Visual Studio را داشته باشید. سوالی که مطرح می شود آیا ارزش دارد که بر روی یک سرور نسخه ای از Visual Studio نصب شود و Ram , CPU , Hard شما همیشه مشغول باشد که تنها می خواهید یک ویندوز سرویس را به سرویس های ویندوز خود اضافه کنید! طبیعتا پاسخ این سوال خیر است.

2- نوع پروژه Windows Service Application از Visual Studio 2015 حذف شده، بدین معنا که شما نمی توانید این نوع پروژه را ایجاد کنید.

3- تنها نکته ی متفاوت پروژه های Windows Service Application با پروژه های Windows Application داشتن دو Event مربوط به OnStart و OnStop می باشد.

حل مشکلات ویندوز سرویس

برای حل این مشکلات می توانید به صورت زیر عمل کنید.

پاسخ مشکل اول)

شما می توانید توسط ابزارهای مختلف Open Source یک برنامه اجرایی را به سادگی به Windows Service اضافه کنید. در اینجا یکی از این برنامه ها را بررسی خواهیم کرد.

 پاسخ مشکل دوم و سوم) 

شما می توایند برنامه خود را به صورت یک برنامه ی ساده Windows Application ایجاد کنید و سپس از طریق راه حلی که در اینجا بررسی خواهیم کرد برنامه خود را به لیست سرویس های ویندوز اضافه کنید. اما برای کنترل اجرا و متوقف شدن برنامه می توانید در برنامه خود این قابلیت را قرار دهید که برنامه شما پس از اجرا شدن در قسمت System Tray نمایش داده شود و در آن جا منوهایی برای متوقف ساخت و یا اجرا شدن برنامه قرار دهید.

اما برای اضافه کردن برنامه های خود به لیست سرویس های ویندوز می توانید از ابزارهای زیادی کمک بگیرید، که یکی از این ابزار ها برنامه ای است که با زبان ++C نوشته شده است.

نام این ابزار nssm می باشد که می توانید آن را از طریق سایت http://nssm.cc این برنامه را دانلود کنید.

 پس از دانلود، فایل مربوط را Extract کنید. حال از طریق Command Prompt و دستور cd بر اساس نسخه ویندوز خود به مسیر نرم افزار بروید.این نرم افزار دو نسخه 32 بیتی و یا 64 بیتی دارد که شما باید بر اساس ویندوز خود به آدرس مورد نظر بروید. در اینجا آدرس ما به صورت زیر است.


Cd C:\Users\Esmaeil\Desktop\Windows Service\nssm-2.24\win64

 

حال دستور زیر را بنویسید و Enter را بزنید. 

install nssm

پس از اجرای دستور بالا پنجره ای مانند پنجره زیر نمایش داده می شود، در این برنامه شما می توانید به سادگی یک برنامه اجرایی را به لیست Service های Windows اضافه کنید.

برای اینکار کافی است مسیر برنامه خود را به همراه نامی که برای این سرویس تمایل دارید نمایش داده شود، مشخص کنید. از قسمت Details نیز می توانید نوع اجرا شدن برنامه (Manual, Automatic) و همچنین Description سرویس را مشخص کنید، در نهایت بر روی گزینه Install Service کلیک کنید تا برنامه شما به لیست سرویس های ویندوز اضافه شود.

 

طبیعتا استفاده از این نرم افزار بر روی سرورها بسیار ساده تر از نصب یک Visual Studio می باشد.

نظرات

  • Hannah Martinez
    Mehrdad
    دو شنبه 11 دی 1278 - 0:00

    بدون شک آموزش بسیار آسان و موثری بود
    ممنون
    ولی در آخر آموزش نوشته بودید که یک روش برای قرار دادن برنامه در سیستم تری Tray در همین مطلب گفته میشه... ولی گفته نشده
    لطفا این رو هم آموزش بدین مرسی
    با تشکر فراوان

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام


      بله حتما، این بخش را هم به زودی بر روی سایت قرار خواهیم داد.

      باتشگر

  • Hannah Martinez
    مهدی
    دو شنبه 11 دی 1278 - 0:00

    سلام دوست عزیز

    من میخوام یه سرویس برای یکی از نرم افزارهام بنویسم یه سرویس ساده همونطور که فرمودید ویژوال استدیو 2015 این نوع پروژه رو نداره ولی به جاش میتونی یه سرویس رو توی خود پروژه اضافه کنی من تموم کارهای پروژم رو انجام دادم سرویسشم کد نویسی کردم ولی متاسفانه نمیدونم چجوری نصب کنم

    ممنون میشم کمکم کنید

    دوست عزیز اگه براتون مقدور بود جواب رو به ایمیلم بفرستید اگرم نه که خودم سرمیزنم همینجا سربلند باشید و بهروز روزتون خوش

  • Hannah Martinez
    Mehdi
    دو شنبه 11 دی 1278 - 0:00

    درود بر شما, واقعا عالی بود سپاس گذارم

  • Hannah Martinez
    مدیروب سایت
    دو شنبه 11 دی 1278 - 0:00

    خواهش میکنم دوست عزیز

    خوشحالیم که این مطلب برای شما بازخورد خوبی داشت.

    موفق باشید

  • Hannah Martinez
    سعید
    سه شنبه 11 تیر 1398 - 16:14

    با سلام،

    ممنون از مقاله بسیار خوبتون.

    من یک مشکلی دارم امیدوارم بتونید کمکم کنید.

    بنده یک سرویس نوشته ام و یک پورت داخل آن LISSEN میکنم (این پورت به یک دستگاهی هست که به صورت REALTIME اطلاعات را میفرسته).الان میخوام بدون اینکه ویندوز سرویسSTOP بشه از این پورت در یک برنامه ویندوزی که نوشته ام همزمان عملیات LISSEN را انجام بدهم.چون این برنامه ویندوزی عملیات مانیتورینگ را انجام میده. حالا به نظرتون من چطور میتونم بین برنامه ویندوزی و ویندوز سرویس تعامل برقرار کنم. ایا امکان داره یک ویندوز سرویس GUI داشته باشه؟؟؟؟
     

    ایا امکان داره یک پورت را دو برنامه LISSEN کنند؟؟

    ممنون میشم کمکم کنید

    با تشکر فراوان؟؟؟؟؟؟؟؟؟؟

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس