zoukankan      html  css  js  c++  java
  • (转)创建Windows服务(Windows Services)N种方式总结

    转自:http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html

    最近由于工作需要,写了一些windows服务程序,有一些经验,我现在总结写出来。
    目前我知道的创建创建Windows服务有3种方式:
    a.利用.net框架类ServiceBase
    b.利用组件Topshelf
    c.利用小工具instsrv和srvany

    下面我利用这3种方式,分别做一个windows服务程序,程序功能就是每隔5秒往程序目录下记录日志:

    a.利用.net框架类ServiceBase

    本方式特点:简单,兼容性好

    通过继承.net框架类ServiceBase实现

    第1步: 新建一个Windows服务

    复制代码
        public partial class Service1 : ServiceBase
        {
            readonly Timer _timer;
    
            private static readonly string FileName = Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ) + @"" + "test.txt";
    
            public Service1 ( )
            {
                InitializeComponent ( );
    
                _timer = new Timer ( 5000 )
                {
                    AutoReset = true ,
                    Enabled = true
                };
    
                _timer.Elapsed += delegate ( object sender , ElapsedEventArgs e )
                {
                    this.witre ( string.Format ( "Run DateTime {0}" , DateTime.Now ) );
                };
            }
    
            protected override void OnStart ( string [ ] args )
            {
                this.witre ( string.Format ( "Start DateTime {0}" , DateTime.Now ) );
            }
    
            protected override void OnStop ( )
            {
                this.witre ( string.Format ( "Stop DateTime {0}" , DateTime.Now ) + Environment.NewLine );
            }
    
            void witre ( string context )
            {
                StreamWriter sw = File.AppendText ( FileName );
                sw.WriteLine ( context );
                sw.Flush ( );
                sw.Close ( );
            }
    
        }
    复制代码

    第2步: 添加Installer

    复制代码
        [RunInstaller ( true )]
        public partial class Installer1 : System.Configuration.Install.Installer
        {
            private ServiceInstaller serviceInstaller;
            private ServiceProcessInstaller processInstaller;
    
            public Installer1 ( )
            {
                InitializeComponent ( );
    
                processInstaller = new ServiceProcessInstaller ( );
                serviceInstaller = new ServiceInstaller ( );
    
                processInstaller.Account = ServiceAccount.LocalSystem;
                serviceInstaller.StartType = ServiceStartMode.Automatic;
    
                serviceInstaller.ServiceName = "my_WindowsService";
                serviceInstaller.Description = "WindowsService_Description";
                serviceInstaller.DisplayName = "WindowsService_DisplayName";
    
                Installers.Add ( serviceInstaller );
                Installers.Add ( processInstaller );
            }  
        }
    复制代码

    第3步:安装,卸载 
    Cmd命令
    installutil      WindowsService_test.exe  (安装Windows服务)
    installutil /u   WindowsService_test.exe  (卸载Windows服务)

    代码下载:http://files.cnblogs.com/aierong/WindowsService_test.rar

    b.利用组件Topshelf

    本方式特点:代码简单,开源组件,Windows服务可运行多个实例

    Topshelf是一个开源的跨平台的服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务. 官方网站:http://topshelf-project.com

    第1步:引用程序集TopShelf.dll和log4net.dll

    第2步:创建一个服务类MyClass,里面包含两个方法Start和Stop,还包含一个定时器Timer,每隔5秒往文本文件中写入字符

    复制代码
        public class MyClass
        {
            readonly Timer _timer;
    
            private static readonly string FileName = Directory.GetCurrentDirectory ( ) + @"" + "test.txt";
    
            public MyClass ( )
            {
                _timer = new Timer ( 5000 )
                {
                    AutoReset = true ,
                    Enabled = true
                };
    
                _timer.Elapsed += delegate ( object sender , ElapsedEventArgs e )
                {
                    this.witre ( string.Format ( "Run DateTime {0}" , DateTime.Now ) );
                };
            }
    
            void witre ( string context )
            {
                StreamWriter sw = File.AppendText ( FileName );
                sw.WriteLine ( context );
                sw.Flush ( );
                sw.Close ( );
            }
    
            public void Start ( )
            {
                this.witre ( string.Format ( "Start DateTime {0}" , DateTime.Now ) );
            }
    
            public void Stop ( )
            {
                this.witre ( string.Format ( "Stop DateTime {0}" , DateTime.Now ) + Environment.NewLine );
            }
    
        }
    复制代码

    第3步:使用Topshelf宿主我们的服务,主要是Topshelf如何设置我们的服务的配置和启动和停止的时候的方法调用

    复制代码
        class Program
        {
            static void Main ( string [ ] args )
            {
                HostFactory.Run ( x =>
                {
                    x.Service<MyClass> ( ( s ) =>
                    {
                        s.SetServiceName ( "ser" );
                        s.ConstructUsing ( name => new MyClass ( ) );
                        s.WhenStarted ( ( t ) => t.Start ( ) );
                        s.WhenStopped ( ( t ) => t.Stop ( ) );
                    } );
    
                    x.RunAsLocalSystem ( );
    
                    //服务的描述
                    x.SetDescription ( "Topshelf_Description" );
                    //服务的显示名称
                    x.SetDisplayName ( "Topshelf_DisplayName" );
                    //服务名称
                    x.SetServiceName ( "Topshelf_ServiceName" );
    
                } );
            }
        }
    复制代码

    第4步: cmd命令

    ConsoleApp_Topshelf.exe  install    (安装Windows服务)

    ConsoleApp_Topshelf.exe  uninstall  (卸载Windows服务)

    代码下载:http://files.cnblogs.com/aierong/ConsoleApp_Topshelf.rar

    c.利用小工具instsrv和srvany

    本方式特点:代码超级简单,WindowsForm程序即可,并支持程序交互(本人最喜欢的特点),好像不支持win7,支持xp win2003

    首先介绍2个小工具:

    instsrv.exe:用以安装和卸载可执行的服务

    srvany.exe:用于将任何EXE程序作为Windows服务运行

    这2个工具都是是Microsoft Windows Resource Kits工具集的实用的小工具 

    你可以通过下载并安装Microsoft Windows Resource Kits获得 http://www.microsoft.com/en-us/download/details.aspx?id=17657

    第1步: 新建WindowsForm程序

    复制代码
       public partial class Form1 : Form
        {
            Timer _timer;
    
            private static readonly string FileName = Application.StartupPath + @"" + "test.txt";
    
            public Form1 ( )
            {
                InitializeComponent ( );
            }
    
            private void Form1_Load ( object sender , EventArgs e )
            {
                _timer = new Timer ( )
                {
                    Enabled = true ,
                    Interval = 5000
                };
    
                _timer.Tick += delegate ( object _sender , EventArgs _e )
                {
                    this.witre ( string.Format ( "Run DateTime {0}" , DateTime.Now ) );
                };
            }
    
            void _timer_Tick ( object sender , EventArgs e )
            {
                throw new NotImplementedException ( );
            }
    
            void witre ( string context )
            {
                StreamWriter sw = File.AppendText ( FileName );
                sw.WriteLine ( context );
                sw.Flush ( );
                sw.Close ( );
            }
    
            private void button1_Click ( object sender , EventArgs e )
            {
                MessageBox.Show ( "Hello" );
            }
    
        }
    复制代码

    第2步:安装,卸载

    服务的安装步骤分5小步:

    (1)打开CMD,输入以下内容,其中WindowsForms_WindowsService为你要创建的服务名称

    格式:目录绝对路径instsrv  WindowsForms_WindowsService  目录绝对路径srvany.exe

    例如:

    D:TempWorkwinDebuginstsrv.exe  WindowsForms_WindowsService  D:TempWorkwinDebugsrvany.exe

    (2)regedit打开注册表编辑器,找到以下目录

    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesWindowsForms_WindowsService

    (3)鼠标右键单击WindowsForms_WindowsService,创建一个"项",名称为"Parameters"

    (4)鼠标左键单击"Parameters",在右边点击鼠标右键,创建一个"字符串值"(REG_SZ),名称为"Application",数值数据里填写目录下可执行文件的绝对路径+文件名

    例如:

    D:TempWorkwinDebugWindowsFormsApplication_Exe.exe

    (5)打开services.msc服务控制面板,找到WindowsForms_WindowsService服务,鼠标右键-属性-登陆,勾选"允许服务与桌面交互"

    启动服务,可以看到程序界面


     

    卸载服务

    D:TempWorkwinDebuginstsrv.exe WindowsForms_WindowsService REMOVE

    代码下载:http://files.cnblogs.com/aierong/WindowsFormsApplication_Exe.rar

  • 相关阅读:
    小波变换的引入,通俗易懂
    Leetcode 437. Path Sum III
    Leetcode 113. Path Sum II
    Leetcode 112 Path Sum
    Leetcode 520 Detect Capital
    Leetcode 443 String Compression
    Leetcode 38 Count and Say
    python中的生成器(generator)总结
    python的random模块及加权随机算法的python实现
    leetcode 24. Swap Nodes in Pairs(链表)
  • 原文地址:https://www.cnblogs.com/JuneZhang/p/6833347.html
Copyright © 2011-2022 走看看