使用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.

過程全部完成。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM