• 我的第一个Windows服务


    代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading.Tasks; 
    
    namespace WindowsService1
    {
        public partial class Service1 : ServiceBase
        {
            //定时器  
            System.Timers.Timer t = null;  
    
            public Service1()
            {
                InitializeComponent();
                //启用暂停恢复  
                base.CanPauseAndContinue = true;
    
                //每5秒执行一次  
                t = new System.Timers.Timer(5000);
                //设置是执行一次(false)还是一直执行(true);  
                t.AutoReset = true;
                //是否执行System.Timers.Timer.Elapsed事件;  
                t.Enabled = true;
                //到达时间的时候执行事件(theout方法);  
                t.Elapsed += new System.Timers.ElapsedEventHandler(theout);  
            }
    
            protected override void OnStart(string[] args)
            {
                string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "启动";
                WriteLog(state);  
            }
    
            protected override void OnStop()
            {
                string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "停止";
                WriteLog(state);  
            }
            //恢复服务执行  
            protected override void OnContinue()
            {
                string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "继续";
                WriteLog(state);
                t.Start();
            }
    
            //暂停服务执行  
            protected override void OnPause()
            {
                string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "暂停";
                WriteLog(state);
    
                t.Stop();
            }
    
    
            public void WriteLog(string str)
            {
                using (StreamWriter sw = File.AppendText(@"d:service.txt"))
                {
                    sw.WriteLine(str);
                    sw.Flush();
                }
            }
    
            public void theout(object source, System.Timers.ElapsedEventArgs e)
            {
    
                WriteLog("theout:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
            }  
        }
    }

    打开ProjectInstaller,修改serviceInstaller1组件属性

    Description= 我的服务备注                       服务备注说明

    DisplayName=我的服务                            服务友好名字 

    ServiceName=MyService                         安装服务器名字

    StartType=Automatic                                服务类型

    Manual      服务安装后,必须手动启动。

    Automatic    每次计算机重新启动时,服务都会自动启动。

    Disabled     服务无法启动。

    并设计serviceProcessInstaller1的属性Account=LocalSystem

    如果将Account设置成User,安装时就会:

     

    安装windows服务要有installutil.exe,这个在安装vs的时候已经有了

    看看自己windows服务的系统版本和net版本找到installutil.exe,

    我的是在:C:WindowsMicrosoft.NETFrameworkv4.0.30319

    并把它复制到新建服务的bin/debug里面,就是跟windows服务的exe在一个文件夹里,这样后面安装比较好

    安装

    dos到windows服务所在文件夹

    installutil.exe WindowsService1.exe

    安装好了以后可以在服务里面查看

    卸载

    installutil.exe -u WindowsService.exe

     点击服务启动

    报错

     这个只要把服务权限选项卡设置everyone就可以了

    查看输出文件

    第三个启动是重新启动,服务先停后启

    自己手动编写代码安装,卸载windows服务

    代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.ServiceProcess;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public string serviceName = "Service1";
            private void button1_Click(object sender, EventArgs e)
            {
                string[] args = { "WindowsService1.exe" };//要安装的服务文件(就是用 InstallUtil.exe 工具安装时的参数)  
                ServiceController svcCtrl = new ServiceController(serviceName);
                if (!ServiceIsExisted(serviceName))
                {
                    try
                    {
                        System.Configuration.Install.ManagedInstallerClass.InstallHelper(args);
                        MessageBox.Show("服务安装成功!");
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        return;
                    }
                }
                else
                {
                    MessageBox.Show("该服务已经存在,不用重复安装。");
                }  
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    if (ServiceIsExisted(serviceName))
                    {
                        //UnInstall Service  
                        System.Configuration.Install.AssemblyInstaller myAssemblyInstaller = new System.Configuration.Install.AssemblyInstaller();
                        myAssemblyInstaller.UseNewContext = true;
                        myAssemblyInstaller.Path = "WindowsService1.exe";
                        myAssemblyInstaller.Uninstall(null);
                        myAssemblyInstaller.Dispose();
                        MessageBox.Show("卸载服务成功!");
                    }
                    else
                    {
                        MessageBox.Show("服务不存在!");
                    }
    
                }
                catch (Exception)
                {
                    MessageBox.Show("卸载服务失败!");
                }  
            }
    
            /// <summary>  
            /// 检查指定的服务是否存在  
            /// </summary>  
            /// <param name="serviceName">要查找的服务名字</param>  
            /// <returns></returns>  
            private bool ServiceIsExisted(string svcName)
            {
                ServiceController[] services = ServiceController.GetServices();
                foreach (ServiceController s in services)
                {
                    if (s.ServiceName == svcName)
                    {
                        return true;
                    }
                }
                return false;
            } 
        }
    }

    要把生成的exe跟要安装的windows服务exe放在一起,这样可以不用instuallutil.exe就可以安装,卸载了

    在卸载是可能会出现服务没有被卸载,状态变成禁用的情况,这种请把服务管理窗口关掉就可以了

    源码

    =======================================

    使用Windows批处理文件,例如添加一个Rongzi.RZR.ProcessExcelServie服务

    install.bat:

    sc create "Rongzi.RZR.ProcessExcelServie" binpath= "%~dp0Rongzi.RZR.ProcessExcel.Sub.exe"
    sc description Rongzi.RZR.ProcessExcelServie "东方融资网融资人粒子导入数据服务"
    sc failure "Rongzi.RZR.ProcessExcelServie" reset= 3600 actions= restart/500/restart/5000/restart/30000
    sc start "Rongzi.RZR.ProcessExcelServie"

    uninstall.bat:

    sc stop "Rongzi.RZR.ProcessExcelServie"
    sc delete "Rongzi.RZR.ProcessExcelServie"

    http://blog.csdn.net/angle860123/article/details/17375895

    https://www.cnblogs.com/pingming/p/5108947.html

  • 相关阅读:
    管理员必备的Linux系统监控工具
    kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
    RedHat linux配置yum本地资源
    RedHat Linux RHEL6配置本地YUM源
    c语言中的fgets函数
    sprintf()函数的用法
    spring boot整合JWT例子
    spring boot 自定义过滤器链
    (转)ArrayList和LinkedList的几种循环遍历方式及性能对比分析
    (转)Springboot 中filter 注入对象
  • 原文地址:https://www.cnblogs.com/hongdada/p/4510255.html
Copyright © 2020-2023  润新知