C#創建服務及使用程序自動安裝服務,.NET創建一個即是可執行程序又是Windows服務的exe


不得不說,.NET中安裝服務很麻煩,即要創建Service,又要創建ServiceInstall,最后還要弄一堆命令來安裝和卸載。

今天給大家提供一種方式,直接使用我們的程序來安裝/卸載服務,並且可以讓一個exe即能直接運行也行安裝為windows服務


首先我們創建一個Windows應用程序,(我創建的是控制台程序,WinForm也一樣)

 

 

接下來在項目中添加一個Windows服務類

 

然后雙擊“MainService.cs”,在上面點右鍵“打開代碼”

 

這里面寫服務的具體實現,以下是我寫的示例代碼

 partial class MainService : ServiceBase
    {
        public MainService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            // TODO:  在此處添加代碼以啟動服務。
            System.IO.File.AppendAllText("D:\\log.txt", "服務已啟動……" + DateTime.Now.ToString());
        }

        protected override void OnStop()
        {
            // TODO:  在此處添加代碼以執行停止服務所需的關閉操作。
            System.IO.File.AppendAllText("D:\\log.txt", "服務已停止……" + DateTime.Now.ToString());
        }
    }

然后我們改程序入口Main方法,讓其在啟動時識別是Windows應用程序還是Windows服務,如果是應用程序就執行應用程序的代碼,如果是服務就執行MainService的代碼

如果是服務,我給了一個"s"參數,如果有這個參數就證明是Windows服務,然后啟動MainService

 static void Main(string[] args)
        {
           //如果傳遞了"s"參數就啟動服務
            if (args.Length > 0 && args[0] == "s")
            {
               //啟動服務的代碼,可以從其它地方拷貝
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
                { 
                    new MainService(),
                };
                ServiceBase.Run(ServicesToRun);
            }
            else
            {}

然后,我們再實現應用程序的功能,就是上面的else語句塊,應用程序的功能就是安裝/卸載服務,可以用windows自帶的sc命令來進行安裝和卸載,具體代碼如下:

                Console.WriteLine("這是Windows應用程序");
                Console.WriteLine("請選擇,[1]安裝服務 [2]卸載服務 [3]退出");
                var rs = int.Parse(Console.ReadLine());
                switch (rs)
                {
                    case 1:
                        //取當前可執行文件路徑,加上"s"參數,證明是從windows服務啟動該程序
                        var path = Process.GetCurrentProcess().MainModule.FileName + " s";
                        Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服務 start= auto");
                        Console.WriteLine("安裝成功");
                        Console.Read();
                        break;
                    case 2:
                        Process.Start("sc", "delete myserver");
                        Console.WriteLine("卸載成功");
                        Console.Read();
                        break;
                    case 3: break;
                }

這樣我們就實現了一個即是可執行程序又是Windows服務的應用程序

Main方法完整代碼如下

 static void Main(string[] args)
        {
            if (args.Length > 0 && args[0] == "s")
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
                { 
                    new MainService(),
                };
                ServiceBase.Run(ServicesToRun);
            }
            else
            {
                Console.WriteLine("這是Windows應用程序");
                Console.WriteLine("請選擇,[1]安裝服務 [2]卸載服務 [3]退出");
                var rs = int.Parse(Console.ReadLine());
                switch (rs)
                {
                    case 1:
                        //取當前可執行文件路徑,加上"s"參數,證明是從windows服務啟動該程序
                        var path = Process.GetCurrentProcess().MainModule.FileName + " s";
                        Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服務 start= auto");
                        Console.WriteLine("安裝成功");
                        Console.Read();
                        break;
                    case 2:
                        Process.Start("sc", "delete myserver");
                        Console.WriteLine("卸載成功");
                        Console.Read();
                        break;
                    case 3: break;
                }
            }
        }

至此,程序已基本寫完,接下來我們測試一下

直接雙擊ServiceOrApp.exe

 

輸入 1

提示安裝成功,然后運行“services.msc"打開服務管理器

可以發現我們的服務已安裝成功,然后右鍵啟動服務

 

成功啟動

然后去D盤看看log.txt

 

說明服務執行正常

我們再停止服務

 

成功停止后再看看D盤的log.txt文件

 

看到以上內容,說明服務啟動和停止都沒問題(忘了輸出換行符 - -!)

然后我們再試一下卸載服務,還是雙擊ServiceOrApp.exe,選擇2

 

提示卸載成功,然后再運行“services.msc"打開服務管理器

 

可以看到已經沒有”我的服務“了,已成功卸載

這里安裝和卸載主要運用了windows的sc命令,然后使用啟動參數來判斷是服務還是程序以執行不同的代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM