این سایت برای ie9 طراحی نشده است

لطفا دستگاه خود را بچرخانید.

ساخت Installer بصورت دستی برای WindowsService در Net.

۵ آبان ۱۳۹۴ نگین ربیعی
بدون دیدگاه

همانطور که در قسمت ساخت Windows Service در Net. گفتیم برای نصب windowService نیاز به Installer داریم و ساخت Installer نیز به دو صورت ممکنه.

۱- اضافه کردن Installer با کلیک راست بر روی نام سرویس (در قسمت قبل بصورت کامل توضیح دادم .)

۲- ساخت Installer به صورت دستی .

هدف این مقاله، قسمت دوم یعنی ساخت Installer بصورت دستیست.

سؤالی که در اینجا مطرح میشه ، اینه که چرا ما می خوایم از این روش استفاده کنیم و اینکه در کجا کاربرد داره !؟

جواب سؤالو می تونم اینجور بگم که برای نصب سرویس نیاز به Installutil داریم و ممکنه در جایی که می خواهیم سرویس ما نصب شه Instalutil  نداشته باشیم (Visual studio بر روی آن نصب نباشد) ، در اینجاست که ما با مشکل مواجه میشیم  و برای حل این مشکل باید Installer  را بصورت دستی ایجاد کنیم بطوری که دیگر نیاز به Installutil ویا نصب visual studio نداشته باشیم.

قدم اول :

کلاسی به نام InstallerClass ایجاد می کنیم و کد زیر را درون آن می نویسیم.

[RunInstaller(true)]
public sealed class MyServiceInstallerProcess :ServiceProcessInstaller
{
    public MyServiceInstallerProcess()
    {
        this.Account = ServiceAccount.LocalSystem;
    }
}
[RunInstaller(true)]
public sealed class MyServiceInstaller : ServiceInstaller
{
    public MyServiceInstaller()
    {
        this.Description = "Send Daily And Weekly Mail";
        this.DisplayName = "MailService";
        this.ServiceName = "MailService";
        this.StartType =System.ServiceProcess.ServiceStartMode.Automatic;
    }



   public static void Install(bool undo, string[] args)
    {
        try
        {
            Console.WriteLine(undo ? "uninstalling" :"installing");
            using (AssemblyInstaller inst = new AssemblyInstaller(typeof(Program).Assembly, args))
            {
                IDictionary state = new Hashtable();
                inst.UseNewContext = true;
                try
                {
                    if (undo)
                    {
                        inst.Uninstall(state);
                    }
                    else
                    {
                        inst.Install(state);
                        inst.Commit(state);
                    }
                }
                catch
                {
                    try
                    {
                        inst.Rollback(state);
                    }
                    catch { }
                    throw;
                }
            }
        }
        catch (Exception ex)
        {
           
            StreamWriter sr = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory+"log.txt", true);
            
            sr.Write(ex.Message);
        }
    }
}

namespace های System.Configuration.Install ، using System.IO ، System.ServiceProcess را  به پروژه اضافه می کنیم .

قدم دوم:

در کلاس Program.cs متد main  زیر را  جایگزین متد main فعلی می کنیم.

static int Main(string[] args) 
        { 
            bool install = false, uninstall = false, 
rethrow = false; 
            try 
            { 
                foreach (string arg in args) 
                { 
                    switch (arg) 
                    { 
                        case "-i": 
                        case "-install": 
                            install = true; break; 
                        case "-u": 
                        case "-uninstall": 
                            uninstall = true; break; 
                     
                      
                        default: 
                            Console.Error.WriteLine("Argument not expected: " + arg); 
                            break; 
                    } 
                }
        
                if (uninstall) 
                { 
                    MyServiceInstaller.Install(true, args); 
                } 
                if (install) 
                {
                    MyServiceInstaller.Install(false, args); 
                } 
                if (!(install || uninstall)) 
                { 
                    rethrow = true; // so that windows sees error... 
                    ServiceBase[] services = { new MailService() }; 
                    ServiceBase.Run(services); 
                    rethrow = false; 
                } 
                return 0; 
            } 
            catch (Exception ex) 
            { 
                if (rethrow) throw; 
                Console.Error.WriteLine(ex.Message); 
                return -1; 
            } 
        }

این متد مشخص می کند که با آرگومان i- ، سرویس Install و با u- سرویس uninstall شود .

باید در قسمت

if (!(install || uninstall))
                {
                    rethrow = true; // so that windows sees error... 
                    ServiceBase[] services = { new Service1() };
                    ServiceBase.Run(services);
                    rethrow = false;
                }

به جای Service1 ، نام سرویسی که می خواهیم ایجاد کنیم را بنویسیم .

همه چیز آمادست وتنها باید سرویس رو نصب کنیم .

برای نصب  ابتدا باید از پروژه  build بگیریم .

روی پروژه کلیک راست کنیم و Open folder in file explorer را بزنیم ، به bin>Debug برویم . در این قسمت یک فایل exe میبینیم مسیر این فایل را کپی کنیم.

حالا یک cmd را بصورت (Run as administrator) باز می کنیم.

آدرسی که در قسمت قبل کپی کرده بودیم را جایگذاری می کنیم و سپس دستور زیر را در ادامه می نویسیم.

WindowsServiceName.exe  -i

si1

میتونیم در Services ، سرویسی که ایجاد کردیم رو ببینیم و اون رو start کنیم.

برای uninstall کردن این سرویس باید از دستور زیر استفاده کنیم

WindowsServiceName.exe -u