zoukankan      html  css  js  c++  java
  • c#开发windows服务

    1.首先添加一个windows服务程序

     2.在  protected override void OnStart(string[] args)中加入我们的业务逻辑代码

    3.在我们的GateService中的设计页面,添加安装程序

     4.配置安装程序serviceProcessInstaller1和serviceInstaller1

    serviceInstaller1中 StartType设置为Manual,ServiceName设置为我们的服务名

      serviceProcessInstaller1 中设置服务类型,Account设置为LocalService

    ---------------------以上我们的服务就开发完成了,但是服务不能直接启动,我们需要一个应用程序来启动我们的服务

    1.建立一个winform应用程序来启动服务

     2.ui页面设计四个按钮:安装、启动、停止、卸载

     3.对我们的服务进行引用

    4.winform代码:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration.Install;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace GateServiceClientManager
    {
        public partial class FrmClient : Form
        {
            string serviceFilePath = $"{Application.StartupPath}\GateServiceManager.exe";//这里是我们服务的exe
            string serviceName = "GateService";
            public FrmClient()
            {
                InitializeComponent();
            }
    
            private void btnset_Click(object sender, EventArgs e)
            {
                this.BeginInvoke(new Action(() =>
                {
                    if (this.IsServiceExisted(serviceName)) this.UninstallService(serviceName);
                    this.InstallService(serviceFilePath);
                    MessageBox.Show("服务安装成功!");
                }));
                
            }
    
            private void btnstart_Click(object sender, EventArgs e)
            {
                this.BeginInvoke(new Action(() =>
                {
                    if (this.IsServiceExisted(serviceName)) this.ServiceStart(serviceName);
                    MessageBox.Show("服务启动成功!");
                }));
              
            }
    
            private void btnstop_Click(object sender, EventArgs e)
            {
                this.BeginInvoke(new Action(() =>
                {
                    if (this.IsServiceExisted(serviceName)) this.ServiceStop(serviceName);
                    MessageBox.Show("服务停止成功!");
                }));
              
            }
    
            private void btnunset_Click(object sender, EventArgs e)
            {
                this.BeginInvoke(new Action(() =>
                {
                    if (this.IsServiceExisted(serviceName))
                    {
                        this.ServiceStop(serviceName);
                        this.UninstallService(serviceFilePath);
                        MessageBox.Show("服务卸载成功!");
                    }
                }));
               
            }
            //判断服务是否存在
            private bool IsServiceExisted(string serviceName)
            {
                ServiceController[] services = ServiceController.GetServices();
                foreach (ServiceController sc in services)
                {
                    if (sc.ServiceName.ToLower() == serviceName.ToLower())
                    {
                        return true;
                    }
                }
                return false;
            }
    
            //安装服务
            private void InstallService(string serviceFilePath)
            {
                using (AssemblyInstaller installer = new AssemblyInstaller())
                {
                    installer.UseNewContext = true;
                    installer.Path = serviceFilePath;
                    IDictionary savedState = new Hashtable();
                    installer.Install(savedState);
                    installer.Commit(savedState);
                }
            }
    
            //卸载服务
            private void UninstallService(string serviceFilePath)
            {
                using (AssemblyInstaller installer = new AssemblyInstaller())
                {
                    installer.UseNewContext = true;
                    installer.Path = serviceFilePath;
                    installer.Uninstall(null);
                }
            }
            //启动服务
            private void ServiceStart(string serviceName)
            {
                using (ServiceController control = new ServiceController(serviceName))
                {
                    if (control.Status == ServiceControllerStatus.Stopped)
                    {
                        control.Start();
                    }
                }
            }
    
            //停止服务
            private void ServiceStop(string serviceName)
            {
                using (ServiceController control = new ServiceController(serviceName))
                {
                    if (control.Status == ServiceControllerStatus.Running)
                    {
                        control.Stop();
                    }
                }
            }
        }
    }

    以上这样我们就可以启动winform程序来打开我们的服务啦

    遇到的问题:

    1.如果需要在GateServiceManager(也就是我们的服务)加入配置文件的信息

    比如:

     在服务中的app.config是读取不到的,在winform中加也是读取不到的。

    解决办法:我们需要在服务中心加入app.config,然后再把服务的app.config复制到winform程序中这样才可以读取到我们的配置信息

     2.如果用winform程序开启服务时,出现:其他信息: 无法启动计算机“.”上的服务 zjService。那一定是你的服务代码写的有问题。不用怀疑直接去改就好了

    --------------------关于服务调试

    首先我们要把我们的服务启动

    2.用vs把服务添加到进程中,进行调试

    找到我们的服务,然后就可以调试了

    注意:在调试OnStart时,一定要加一个延迟Thread.Sleep(30000); ,要不然总是调试不到。真的有点坑!!!

    至此,你就掌握了如何开发windows服务啦~

  • 相关阅读:
    python3的pygame的五子棋布局设置和代码详细分析
    RAID原理分析
    Python攻城狮教你用Pythin开机和关机,关机只需一条执行命令
    Python 之 MySql 每日一练 329——查询名字中含有风字的学生信息
    Python 之 MySql 每日一练 232——查询每门课程的平均成绩
    网络虚拟化基础协议·Geneve
    openstack octavia的实现与分析(一)openstack负载均衡的现状与发展以及lvs,Nginx,Haproxy三种负载均衡机制的基本架构和对比
    Linux下多网卡绑定bond及模式介绍
    Python调试器-pdb的使用
    ubuntu server安装的一些坑
  • 原文地址:https://www.cnblogs.com/daimaxuejia/p/12916467.html
Copyright © 2011-2022 走看看