zoukankan      html  css  js  c++  java
  • 使用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.

    过程全部完成。

  • 相关阅读:
    安装centos后无法引导启动windows7的解决方法
    Ubuntu14.04 搜索不到WIFI或连接不上的解决方法。
    ubuntu磁盘分区问题
    Cenos7下nginx+mysql+php环境的搭建
    PHP发送邮件
    php使用数据库的并发问题(乐观锁与悲观锁)
    总结一些php的面试题
    遇到高并发一些处理方法
    PHP中9大缓存技术总结
    php并发加锁示例
  • 原文地址:https://www.cnblogs.com/bluedoctor/p/5672087.html
Copyright © 2011-2022 走看看