zoukankan      html  css  js  c++  java
  • 使用Topshelf创建Windows 服务

    Winndows Service 是一种可随 Windows 操作系统启动而启动的,在后台运行的,通常不和用户产生交互的程序。它无法通过双击来运行,类似于 Unix 守护进程(daemon processes),当用户注销时它也不会停止。

    Windows 服务由三部分组成:

    • 一个服务可执行文件;
    • 一个服务控制程序(SCP);
    • 服务控制管理器(SCM),负责在 HKLM"SYSTEM"CurrentControlSet"Services 下创建服务键值。用户可通过 SCP 控制服务的启动、停止、暂停等,SCP 会通过 SCM 调用服务程序

    开发一个Windows服务通常也比较简单,在开发的时候我们期望以命令行方式运行,想对Windows服务有更多的控制,就有一个Windows服务框架TopShelf 可以满足,使用这个框架要求你使用一个IoC容器,在框架中使用的是common service locator 接口,可以根据你的喜好去选择你自己中意的IoC容器。

    TopShelf的基本介绍可以参看Dru Sellers 的介绍性文章 TopShelf。下面的代码就是创建了一个Windows服务:

    using System; 
        using System.Collections.Generic; 
        using System.IO; 
        using System.Timers; 
        using log4net.Config; 
        using Microsoft.Practices.ServiceLocation; 
        using StructureMap; 
        using Topshelf; 
        using Topshelf.Configuration;

        internal class Program 
        { 
            static void Main(string[] args) 
            { 
                XmlConfigurator.ConfigureAndWatch(new FileInfo(".\log4net.config")); 
                IRunConfiguration cfg = RunnerConfigurator.New(x => 
                { 
                    x.AfterStoppingTheHost(h => { Console.WriteLine("AfterStop called invoked, services are stopping"); });

                     x.SetDescription("Sample Topshelf Host"); 
                    x.SetDisplayName("Stuff"); 
                    x.SetServiceName("stuff"); 

                    x.ConfigureServiceInIsolation<TownCrier>("tc", s => 
                    { 
                        s.CreateServiceLocator(()=> 
                        { 
                            ObjectFactory.Initialize(i => 
                            { 
                                i.ForConcreteType<TownCrier>().Configure.WithName("tc"); 
                            });

                            return new StructureMapServiceLocator(); 
                        }); 
                        s.WhenStarted(tc => tc.Start()); 
                        s.WhenStopped(tc => tc.Stop()); 
                    }); 

                    x.RunAsLocalSystem();

                   });

                Runner.Host(cfg, args); 
            } 
        }

    这里我们使用了StructureMap 作为IoC容器,创建了一个StructureMapServiceLocator来掩藏StructureMap,创建的Windows服务的名称是stuff,可以吊相应的方法启动,停止服务。通过直接运行.exe文件在控制台中运行或者调试服务了。

    通过命令运行,安装卸载Windows服务

    Stuff.exe                #控制台方式运行

    Stuff.exe /install     #安装Windows服务

    Stuff.exe /uninstall  #卸载Windows服务

    默认情况下,Windows服务只能运行一个实例,如果我们想运行多个实例怎么办,可以在Topshelf的命令行参数中增加–instance <instance name>来指定实例的名称,也可以通过运行时读取配置文件来达到目的,我更喜欢使用后一种方式设置,在应用程序的配置文件上增加个配置WindowsServiceInstanceName:

    <?xml version="1.0" encoding="utf-8" ?>

    <configuration>

       <appSettings file="applicationSettings.config">

        <add key="WindowsServiceInstanceName" value="Stuff"/>

       </appSettings>

    </configuration>

    然后改造一下上述代码

           static void Main(string[] args) 
            {

                var instanceName = ConfigurationManager.AppSettings["WindowsServiceInstanceName"];

                XmlConfigurator.ConfigureAndWatch(new FileInfo(".\log4net.config")); 
                IRunConfiguration cfg = RunnerConfigurator.New(x => 
                { 
                    x.AfterStoppingTheHost(h => { Console.WriteLine("AfterStop called invoked, services are stopping"); });

                    x.SetDescription("Sample Topshelf Host"); 
                    x.SetDisplayName(instanceName ); 
                    x.SetServiceName(instanceName ); 
    ……

    这样我们就可以达到在同台机器上安装多个Windows 服务实例,推荐大家使用这个Windows服务框架TopShelf ,可以简化很多工作和增加灵活性

  • 相关阅读:
    atitit.ntfs ext 文件系统新特性对比
    Atitit.图片木马的原理与防范 attilax 总结
    Atitit.图片木马的原理与防范 attilax 总结
    Atitit.jdk java8的语法特性详解 attilax 总结
    Atitit.jdk java8的语法特性详解 attilax 总结
    Atitit.远程接口 监控与木马   常用的api 标准化v2 q216
    Atitit.远程接口 监控与木马   常用的api 标准化v2 q216
    Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结
    Atitit..jdk java 各版本新特性 1.0 1.1 1.2 1.3 1.4 1.5(5.0) 1.6(6.0) 7.0 8.0 9.0 attilax 大总结
    Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216  java c# php js.docx
  • 原文地址:https://www.cnblogs.com/bravenight/p/4562887.html
Copyright © 2011-2022 走看看