使用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 来指定实例的名称,也可以通过运行时读取配置文件来达到目的,我更喜欢使用后一种方式设置,在应用程序的配置文件上增加个配置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 ,可以简化很多工作和增加灵活性

本文来自合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号

时间: 2024-07-28 20:28:00

使用Topshelf创建Windows 服务的相关文章

使用Topshelf 5步创建Windows 服务

使用Topshelf创建Windows 服务简要的介绍了创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的介绍使用使用Topshelf创建Windows 服务.Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主. 1.Topshelf的代码托管在http://topshelf-project.c

如何创建Windows服务

创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Services.ServicesPS .其实主要是使用Services,VS2012下不清楚为什么生成了两个项目. 注册Windows服务 Windows服务第一次启动时,是需要注册的,注册方式可以通过命令行或批处理的方式. Services.exe -regserver 卸载Windows服务 既然服务需要注册,那

C#通过创建Windows服务启动程序的方法详解_C#教程

本文实例讲述了C#通过创建Windows服务启动程序的方法.分享给大家供大家参考,具体如下: 1. 新建一个Windows服务应用程序 创建项目-->Visual C# 左侧的"+"-->Windows -->Windows 服务(右侧模板)-->输入名称,确定创建项目 2. 设置Windows服务的属性(Windows服务里没有窗体,所以点击左侧设计器里空白的地方即可在右侧属性栏里看到属性) 这里属性是控制服务器是否可以停止,暂停,继续等等的操作.根据需要选择

使用Topshelf 开发windows服务

在业务系统中,我们为了调度一些自动执行的任务或从队列中消费一些消息,所以基本上都会涉及到后台服务的开发.如果用windows service开发,非常不爽的一件事就是:调试相对麻烦,而且你还需要了解 windows service 相关的一些开发和安装部署,所以,windows service非常的不方便.Topshelf框架,能够让你将 console application 直接封装为 windows service,这样你在开发的时候,就可以直接在console 程序上开发,然后构成win

用.NET创建Windows服务

window|创建 我们将研究如何创建一个作为Windows服务的应用程序.内容包含什么是Windows服务如何创建.安装和调试它们.会用到System.ServiceProcess.ServiceBase命名空间的类.  什么是Windows服务 Windows服务应用程序是一种需要长期运行的应用程序它对于服务器环境特别适合.它没有用户界面并且也不会产生任何可视输出.任何用户消息都会被写进Windows事件日志.计算机启动时服务会自动开始运行.它们不要用户一定登录才运行它们能在包括这个系统内的

创建windows服务,定时监控网站应用程序池

最近网站总是报"Timer_Connection"错误,导致该网站所使用的应用程序池由于错误过多停止运行,网站也就出现了service unvaliable,无法访问,在网上查了很多资料, 结果很让人无奈,这个问题已经困扰我了很久,一直没有得到解决,后来同事发来一篇文章让我有了新的解决方法,虽然不能根本解决这个报错,但可以快速清空并恢复指定的应 用程序池 不多说了,看看下面这个方法吧,主要是创建一个连接(如你要监控的网站的一个地址),如果能访问到这个页面说明网站应用程序池没有问题,如果

用.NET创建Windows服务的方法第1/2页_C#教程

译者说明:我是通过翻译来学习C#的,文中涉及到的有Visual Studio.NET有关操作,我都根据中文版的VS.NET显示信息来处理的,可以让大家不致有误解. 作者:Mark Strawmyer 我们将研究如何创建一个作为Windows服务的应用程序.内容包含什么是Windows服务,如何创建.安装和调试它们.会用到System.ServiceProcess.ServiceBase命名空间的类. 什么是Windows服务? Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器

vb.net中windows服务的创建

window|创建   无论windows服务执行什么样的处理,创建与安装服务的步骤都十分相似.visual studio提供了windows services项目类型,利用它可以迅速创建windows服务,一下介绍简单的步骤: 1)新建项目,在new project对话框中,选择windows服务图标,在对话框name字段输入服务名称,确定.visual studio将显示服务的设计视图. 2)在服务属性里面进行设置:servicebase类的属性如下:               a.aut

用C#创建Windows(NT)服务

window|创建 Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是一件困难的事,本文就将指导你一步一步创建一个Windows服务并使用它.这个服务在启动和停止时,向一个文本文件中写入一些文字信息.这个小技巧来自于MSDN,但是现在程序编写的更加清晰,并且你可以根据你的需要修改它.可下载工程文件包:mcWinService.zip. 第一步:创建服务框架 要创建一个新的 Windows 服务,可