Topshelf
Windows Service
使用 Topshelf 簡化 Windows Service 開發
2019/12/09 11:06:11
0
28510
為什麼使用 Topshelf
使用傳統開發 Windows Service 方式時,必定會面臨到如何在開發時期進行偵錯的問題,當然利用一些小技巧是可以達成 (ex. 參考 如何對 Windows Service 進行除錯 文章),但到底還是要手動切換;透過 Topshelf 這個套件可以讓開發者直接使用 Console 方式進行開發,編譯出來就是一隻 console 程式且可以獨自運行,又可以透過命令列指令將這個 console 執行檔安裝成為 Windows Service 服務,達到易於開發、偵錯及靈活使用的優點,以下介紹。
開發實作說明
首先建立一個 Console 專案
透過 Nuget 下載 Topshelf 套件 (目前版本為 4.2.1)
接著簡單建立一個 MainService 物件,用來處理此服務主要作業邏輯,以及開始與結束作業邏輯;所以一個最精簡的 Timer 重複性作業結構如下所示,
class MainService
{
private Timer _timer;
public MainService()
{
_timer = new Timer(1000) { AutoReset = true };
_timer.Elapsed += new ElapsedEventHandler(this.MainTask);
}
private void MainTask(object sender, ElapsedEventArgs args)
{
// do main task here
Console.WriteLine("do main task at: " + DateTime.Now);
}
public void Start()
{
_timer.Start();
}
public void Stop()
{
_timer.Stop();
}
}
接著再程式進入點就可以使用 HostFactory 掛載 MainService 執行主要工作。
using Topshelf;
namespace TopShelfConsole
{
class Program
{
static void Main(string[] args)
{
HostFactory.Run(x =>
{
x.Service<MainService>(s =>
{
s.ConstructUsing(name => new MainService());
s.WhenStarted(ms => ms.Start());
s.WhenStopped(ms => ms.Stop());
});
x.SetServiceName("SampleServiceName");
x.SetDisplayName("SampleDisplayName");
x.SetDescription("SampleDescription");
x.RunAsLocalSystem();
x.StartAutomatically();
});
}
}
}
直接執行,我們的服務就已經被 Host 到主控台應用程式上執行,而開發人員可以在這個階段就可以直接偵錯;要結束 Service 可以按下 Control + C 即可中斷。
Windows Service
我們最終的目的就是要服務 Host 在 Windows Service 中,因此可以透過 command line 來執行安裝 / 移除作業,如果需要更多資訊可以輸入 help 參考命令集說明。
安裝僅須透過輸入 YourConsoleName.exe install 執行即可
解除安裝輸入 YourConsoleName.exe uninstall 執行即可
參考資訊