使用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.
复制代码

过程全部完成。


    本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/p/5672087.html,如需转载请自行联系原作者




相关文章
|
2月前
|
NoSQL Redis Windows
windows服务器重装系统之后,Redis服务如何恢复?
windows服务器重装系统之后,Redis服务如何恢复?
71 6
|
1月前
|
边缘计算 安全 网络安全
|
1月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
89 9
|
1月前
|
应用服务中间件 Apache Windows
免安装版的Tomcat注册为windows服务
免安装版的Tomcat注册为windows服务
102 3
|
1月前
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
33 1
|
2月前
|
消息中间件 Java Kafka
windows服务器重装系统之后,Kafka服务如何恢复?
windows服务器重装系统之后,Kafka服务如何恢复?
30 8
|
2月前
|
Windows Python
python获取windows机子上运行的程序名称
python获取windows机子上运行的程序名称
|
1月前
|
弹性计算 关系型数据库 网络安全
阿里云国际版无法连接和访问Windows服务器中的FTP服务
阿里云国际版无法连接和访问Windows服务器中的FTP服务
|
1月前
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
61 0
|
2月前
|
安全 网络安全 API
基于WMI更新Windows系统信息采集程序sysInfo的一些收获
基于WMI更新Windows系统信息采集程序sysInfo的一些收获