使用Topshelf建立自宿主的Windows服務程式
阿新 • • 發佈:2022-04-29
在傳統的Windows服務開發過程中,需要新增一個服務安裝程式,裡面寫安裝,啟動和停止服務等邏輯。現在,使用TopSelf可以簡化這個過程。具體請看官網說明:
http://docs.topshelf-project.com/en/latest/index.html
開始前,先建立一個控制檯程式,新增 Topshelf 程式包引用:
Install-Package Topshelf
首先,繼承 ServiceControl 寫一個應用服務類:
internal class AppService : ServiceControl { ILog log = LogManager.GetLogger(typeof(AppService)); public void Initialize() { log.Info("Initialize"); Console.WriteLine("Engine starting...."); EngineContext.Initialize(false); Console.WriteLine("Engine started"); } public bool Start(HostControl hostControl) { Console.WriteLine("Hosts starting...."); ServiceHostHelper.OpenWcfService(); Console.WriteLine("Hosts started"); return true; } public bool Stop(HostControl hostControl) { ServiceHostHelper.CloseWcfService(); return true; } }
然後,在主程式裡面,寫如下程式碼:
static void Main(string[] args) { try { HostFactory.Run(x => { x.RunAsLocalSystem(); x.StartAutomatically(); //x.StartManually(); var defaultName = GetDefaultServiceName(); var config = DXNConfig.Current.AppServer; x.SetServiceName("我的服務1"); x.SetDisplayName("我的服務1"); x.SetDescription("我的服務1描述"); x.Service(factory => { var service = new AppService(); service.Initialize(); return service; }); }); } catch (Exception ex) { try { LogManager.GetLogger(typeof(Program)).Fatal("AppServer launch error", ex); } catch { } //throw; } } }
這些服務名稱性資訊是可以修改的。 好了,現在編譯,我們的程式就可以當服務使用了。
之後,就可以用命令列來安裝服務:
@echo off
%~d0
cd %~dp0
cd..
rem ApplicationServer.exe install -servicename "ApplicationServer" -displayname "ApplicationServer" -description "XX業務管理系統"
ApplicationServer.exe install
@echo 啟動服務...
ApplicationServer.exe start
echo 啟動結束
啟動服務:
sc start "ApplicationServer"
停止服務:
sc stop "ApplicationServer"
解除安裝服務:
ApplicationServer.exe uninstall
執行第一個啟動服務的批處理檔案,將輸出下面的內容:
Configuration Result:
[Success] Name DEV_DXN_ApplicationServer
[Success] DisplayName ApplicationServer
[Success] Description XXX業務管理系統
[Success] ServiceName ApplicationServer
Topshelf v3.0.105.0, .NET Framework v4.0.30319.34014
正在執行事務處理安裝。
正在開始安裝的“安裝”階段。
Installing DXN ApplicationServer service
正在安裝服務 DXN_ApplicationServer...
已成功安裝服務DXN_ApplicationServer。
正在日誌 Application 中建立 EventLog 源 ApplicationServer...
“安裝”階段已成功完成,正在開始“提交”階段。
“提交”階段已成功完成。
已完成事務處理安裝。
啟動服務...
Configuration Result:
[Success] Name DXN_ApplicationServer
[Success] DisplayName ApplicationServer
[Success] Description XX管理系統
[Success] ServiceName ApplicationServer
Topshelf v3.0.105.0, .NET Framework v4.0.30319.34014
The ApplicationServer service is not installed.
過程全部完成。