• Windows 安装服务-安装工具


    示例

    1.新建Windows服务MyWindowsService

     2.把Service1改为MyService.cs,添加代码如下,重新编译,至此Windows服务建立完毕.

    代码:

    using System;
    using System.IO;
    using System.ServiceProcess;
    namespace MyWindowsService
    {
    public partial class MyService : ServiceBase
    {
    public MyService()
    {
    InitializeComponent();
    }
    string filePath = AppDomain.CurrentDomain.BaseDirectory+"MyServiceLog.txt";

    //服务启动
    protected override void OnStart(string[] args)
    {
    using (FileStream stream = new FileStream(filePath, FileMode.Append))
    using (StreamWriter writer = new StreamWriter(stream))
    {
    writer.WriteLine($"{DateTime.Now},服务启动!");
    }
    }

    //服务关闭

    protected override void OnStop()
    {
    using (FileStream stream = new FileStream(filePath, FileMode.Append))
    using (StreamWriter sw = new StreamWriter(stream))
    {
    sw.WriteLine($"{DateTime.Now},服务停止!");
    }
    }
    }
    }

    二、建立Windows服务安装工具,建立一个WinForm应用程序,窗体上放置4个按钮,如下图

    1.

     2.按F7,引入命名空间,并把目标项目(MyWindowsService项目引入到当前项目中)

    using System;
    using System.Collections;
    using System.Configuration.Install;
    using System.ServiceProcess;
    using System.Windows.Forms;

    namespace WindowsServiceClient
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }
    string serviceFilePath = $"{Application.StartupPath}\MyWindowsService.exe";
    string serviceName = "MyService";

    //判断服务是否存在
    private bool IsServiceExisted(string serviceName)
    {
    ServiceController[] services = ServiceController.GetServices();    //和FileInfo[] fs=File.GetFiles()类似,得到当前系统中的所有服务。
    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 saveState = new Hashtable(); //创建一个哈希表
    installer.Install(saveState);  //安装处理事务
    installer.Commit(saveState);//提交安装
    }
    }

    //卸载服务
    private void UninstallService(string serviceName)
    {

    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 BtnInstall_Click(object sender, EventArgs e)
    {
    if (this.IsServiceExisted(serviceName)) this.UninstallService(serviceName);
    this.InstallService(serviceFilePath);
    }
    //停止服务
    private void ServiceStop(string serviceName)
    {
    using (ServiceController control = new ServiceController(serviceName))
    {
    if (control.Status == ServiceControllerStatus.Running)
    {
    control.Stop();
    }
    }
    }

    private void BtnStart_Click(object sender, EventArgs e)
    {
    if (this.IsServiceExisted(serviceName)) this.ServiceStart(serviceName);
    }

    private void BtnStop_Click(object sender, EventArgs e)
    {
    if (this.IsServiceExisted(serviceName)) this.ServiceStop(serviceName);
    }

    private void BtnUninstall_Click(object sender, EventArgs e)
    {
    if (this.IsServiceExisted(serviceName))
    {
    this.ServiceStop(serviceName);
    this.UninstallService(serviceName);
    }
    }
    }
    }

    经验总结:AssemblyController 来控制服务的安装卸载,ServiceController 来控制服务的启动停止

    另外:快速卸载服务  管理员身份进入cmd >  sc delete 服务名

    本文参考:https://www.cnblogs.com/cncc/p/7170951.html

  • 相关阅读:
    vue-router(路由)详细教程
    vue路由对象($route)参数简介
    this.$router.push相关的vue-router的导航方法
    es6 Promise.reject()方法
    百度阿里网易大疆等大小厂前端校招面筋 | 掘金技术征文
    Vue 脱坑记
    (尚016)Vue指令(11个自带指令+自定义指令)
    (尚015)Vue过滤器(对显示的数据进行格式化)
    (尚014)Vue过渡与动画
    (尚013)Vue的生命周期
  • 原文地址:https://www.cnblogs.com/sundh1981/p/13982717.html
Copyright © 2020-2023  润新知