1. 程式人生 > 其它 >使用Topshelf建立自宿主的Windows服務程式

使用Topshelf建立自宿主的Windows服務程式

在傳統的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.

過程全部完成。