首頁 > 軟體

VS2022建立Windows服務程式的方法步驟

2022-05-19 13:00:16

建立一個Windows服務程式

可以建立Windows服務程式

開啟VS2022,新建專案。

建立成功後的目錄結構如左側所示,至此專案構建完成。

設定相關資訊

新增安裝程式

重新生成一下解決方案

至此設定完成。

指令碼可執行檔案

在工程目錄的binDebug目錄下 新建兩個指令碼檔案–install.bat和uninstall.bat,分別用於安裝服務和解除安裝服務。

install.bat

%SystemRoot%Microsoft.NETFramework64v4.0.30319InstallUtil.exe %~dp0MyFirstWindowsService.exe
Net Start MyFirstService
sc config MyFirstService start=auto
pause

簡單說明

uninstall.bat

%SystemRoot%Microsoft.NETFramework64v4.0.30319InstallUtil.exe /u %~dp0MyFirstWindowsService.exe
pause

至此設定完成。

執行指令碼檔案

執行安裝指令碼檔案

可以右鍵我的電腦 -> 管理 找到服務,在右側尋找我們自己的服務名稱

執行解除安裝指令碼檔案

如果不能建立Windows服務程式

如果輸入上述條件沒有找到可建立的工程,點選安裝多個工具和功能。

或者在某個工程的工具裡點選獲取工具和功能

等待安裝完畢,按上面的步驟來即可。

簡單地使用

使用本機服務和定時器Timer,簡單做一個WindowsService的記錄紀錄檔。

建立一個新的Windows服務

按照上述步驟建立一個新的Windows服務,名為WindowsService2,並且服務名稱為WindowsService2。

我們主要的程式碼在Service1.cs中寫,選中該檔案,右鍵選擇檢視程式碼。

記得在App.config中設定鍵值對 value是紀錄檔記錄地址 可自行選擇。

主要程式碼

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

namespace WindowsService2
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }
        //建立定時器
        public System.Timers.Timer ServiceTimer;
        //從App.config中取值 這裡我的紀錄檔檔案位置在F:log.txt 這裡可以自行設定
        public string filePath = ConfigurationManager.AppSettings["FilePath"];
        //主要功能程式碼在這裡寫
        protected override void OnStart(string[] args)
        {
            //紀錄檔記錄方法
            WriteLog(filePath, "啟動服務。");
            InitTimer();//初始化的定時器
        }

        protected override void OnStop()
        {
            //停止服務
            WriteLog(filePath , "停止服務。");
        }

        public void InitTimer()
        {
            //設定定時器兩秒執行一次
            ServiceTimer = new System.Timers.Timer(2000);
            //執行的操作為Excute
            ServiceTimer.Elapsed += Excute; 
            //是否重複執行
            ServiceTimer.AutoReset = true;
            //是否執行Elapsed中的事件
            ServiceTimer.Enabled = true;
        }

        public void Excute(Object o , System.Timers.ElapsedEventArgs e)
        {
            //判斷是否執行
            if (!File.Exists(filePath))
            {
                //不存再則建立
                File.Create(filePath);
            }
            //再這裡寫入紀錄檔
            string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");         
            WriteLog(filePath, DateTime.Now.ToString(), "進行了操作。 紀錄檔檔案路徑位於: " + filePath + " AppSetting : " + ConfigurationManager.AppSettings["FilePath"]);
        }
        //寫入紀錄檔檔案
        public static void WriteLog(string path, params string[] s)
        {
            //建立輸入流
            System.IO.StreamWriter writer = null;
            try
            {
                writer = new System.IO.StreamWriter(path, true);
                StringBuilder sb = new StringBuilder("");
                for (int i = 0; i < s.Length; i++)
                {
                    sb.Append(" ");
                    sb.Append(s[i]);
                }
                writer.WriteLine(sb.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }

            finally
            {
                //關閉流 釋放資源
                if (writer != null)
                {
                    writer.Close();
                    writer.Dispose();
                }
            }
        }
    }
}

執行結果

其他的問題

更改程式碼後需要重新生成

每次更改執行程式碼後需要右鍵專案 -> 重新生成,否則更改不會生效。

某些名稱空間如無效需手動引入

以Configuration的名稱空間舉例,即使加了using System.Configuration; 也有可能出現ConfigurationManager無法使用,這時我們可以手動引入。

找到工程右側引入,右鍵新增參照。

指令碼問題

編碼問題

建立bat檔案時,有時候字元集編碼可能不對,導致指令碼執行時出現問題,我們可以用Notepad3開啟,更改編碼格式為ANSI或者UTF-8。

許可權問題

執行指令碼檔案時,需要右鍵以管理員身份執行,否則就會出現以下情況,導致服務安裝失敗。

空格問題

如果指令碼某些地方出現空格,會導致指令碼執行失敗。
比如

會導致以下報錯

到此這篇關於VS2022建立Windows服務程式的方法步驟的文章就介紹到這了,更多相關VS2022建立Windows服務程式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com