1. 程式人生 > 實用技巧 >Windows服務/Linux守護建立及安裝

Windows服務/Linux守護建立及安裝

前言說明

在微軟技術棧中,眾所周知有一類專案是用於支援WindowService,並且目前只支援Windows系列的系統。而專案的建立、除錯、安裝都相對新接觸的朋友而言還是比較複雜。

在這裡介紹一種相對於簡單、明瞭的元件,同時可以支援Linux守護(需要目標框架.Net Core 3.1以上的版本);

NewLife.Agent(支援.Net Framework4.0以上、.Net Core、.Net5.0),新生命團隊(大石頭)開發維護的元件,也希望大家可以加入共同探討,QQ群:1600800

使用工具:VS2019

專案建立、安裝步驟

1、標準的Windows服務建立和安裝,這裡就不多介紹了,各位百*、*歌自行查詢相關資料.......

2、建立控制檯應用程式專案,目標框架各位操作的時候自行看需求選擇

3、nuget安裝NewLife.Agent,建立Service類,繼承NewLife.Agent.ServiceBase類

NewLife.Agent專案引用版本8.7.2020.802

其中主要修改 Program Main方法呼叫new Service().Main(args);

而Service主要方法在於 StartWork、StopWork

  class Program
    {
        static void Main(string[] args) => new Service().Main(args);
    }

    
class Service : ServiceBase { public Service(){ ServiceName = "榮少-Leif Service ServiceName";//服務名 DisplayName = "榮少-Leif Service DisplayName";//顯示名 Description = "榮少-Leif Service Description";//描述 AddMenu('8', "除錯", () => { XTrace.WriteLine($"除錯啟動
"); StartWork(string.Empty); }); } protected override void StartWork(string reason) { //任務啟動業務處理 for (int i = 0; i < 1000; i++) { XTrace.WriteLine($"{i}--{DateTime.Now}"); Thread.Sleep(1000); } base.StartWork(reason); } protected override void StopWork(string reason) { //任務停止業務處理 base.StopWork(reason); } }

4、如何除錯?

在構造方法敲以下程式碼即可,簡單的除錯處理(由於1-7基本都在元件上已經給佔用了,所有剩下的只有8-9可以根據自己的想法處理,需要更多的自行重構即可)

AddMenu('8', "除錯", () => { StartWork(string.Empty); });

5、WindowService安裝 (由於許可權問題,需要增加應用程式清單檔案)、Linux守護安裝(家裡沒有Linux環境,各位自行操作下);

修改檔案中level="asInvoker"部分level="requireAdministrator"即可

<!-- UAC 清單選項
             如果想要更改 Windows 使用者帳戶控制級別,請使用
             以下節點之一替換 requestedExecutionLevel 節點。n
        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            指定 requestedExecutionLevel 元素將禁用檔案和登錄檔虛擬化。
            如果你的應用程式需要此虛擬化來實現向後相容性,則刪除此
            元素。
        -->
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />

各位看了簡單的說明對比起來是否相對而言簡單些許,如果能幫到各位的話,請大家動動小手指點點推薦,謝謝大家了。