c# 服务创建

服务

创建服务

编写服务

可以对server1.cs重新命名,点击你的server按F7进入代码编辑模式,编写脚本

双击你的server.cs右击空白位置,添加安装程序,此时会生成“serviceInstaller1”及“serviceProcessInstaller1”

后续可以点击ProjectInstaller.cs查看已经添加的程序

修改属性

右击serviceInstaller1属性修改servicename,用于等下启动服务的名称

右击serviceProcessInstaller1属性修改Account改为LocalSystem(服务属性系统级别)

至此服务已经编写完毕

启动服务

启动服务可以使用多种方式,这里介绍两种思路

创建bat文件启动

新建一个txt,等下修改为.bat,可以创建多个.bat用于安装服务,开启服务等

使用sc创建

//创建-配置-开启 

@echo.服务启动......  
@echo off  
@sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32srvdemo\win32srvdemo\Debug\win32srvdemo.exe"  
@net start 服务名  
@sc config 服务名 start= AUTO  
@echo off  
@echo.启动完毕!  
@pause

//关闭服务

@echo.服务关闭  
@echo off  
@net stop 服务名  
@echo off  
@echo.关闭结束!  
@pause

//删除服务

@echo.服务删除  
@echo off  
@sc delete 服务名 
@echo off  
@echo.删除结束!  
@pause

使用net framework提供的命令启动

//安装-启动-设置自动运行 - 暂停
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe "你的地址\MyTask.exe"
Net Start 服务名
sc config 服务名 start= auto
pause

//卸载服务
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u "你的地址\MyTask.exe"
pause

使用winform窗体,代码启动

点击解决方案,创建一个winform项目net framework

设置安装,卸载,启动和关闭按钮,设置单击事件

private void button1_Click(object sender, EventArgs e)
{
    //安装服务
    if (ServiceHelperOne.IsServiceExisted(serviceName))
        ServiceHelperOne.UninstallService(serviceFilePath);
    ServiceHelperOne.InstallService(serviceFilePath);
}
private void button_start_Click(object sender, EventArgs e)
{
    //运行服务
    if (ServiceHelperOne.IsServiceExisted(serviceName))
        ServiceHelperOne.ServiceStart(serviceName);
}

private void button_stop_Click(object sender, EventArgs e)
{
    //服务停止
    if (ServiceHelperOne.IsServiceExisted(serviceName))
        ServiceHelperOne.ServiceStop(serviceName);
}

private void button_unservice_Click(object sender, EventArgs e)
{
    //服务卸载
    if (ServiceHelperOne.IsServiceExisted(serviceName))
    {
        ServiceHelperOne.ServiceStop(serviceName);
        ServiceHelperOne.UninstallService(serviceFilePath);
    }
}

增加一个帮助类

   public class ServiceHelperOne
   {
       //判断服务是否存在
       public static bool IsServiceExisted(string serviceName)
       {
           ServiceController[] services = ServiceController.GetServices();
           foreach (ServiceController sc in services)
           {
               if (sc.ServiceName.ToLower() == serviceName.ToLower())
               {
                   return true;
               }
           }
           return false;
       }

       //安装服务
       public static void InstallService(string serviceFilePath)
       {
           try
           {
               using (AssemblyInstaller installer = new AssemblyInstaller())
               {
                   installer.UseNewContext = true;
                   installer.Path = serviceFilePath;
                   IDictionary savedState = new Hashtable();
                   installer.Install(savedState);
                   installer.Commit(savedState);
               }
           }
           catch (Exception ex)
           {
               var err = ex.Message;
           }
       }

       //卸载服务
       public static void UninstallService(string serviceFilePath)
       {
           using (AssemblyInstaller installer = new AssemblyInstaller())
           {
               installer.UseNewContext = true;
               installer.Path = serviceFilePath;
               installer.Uninstall(null);
           }
       }
       //启动服务
       public static void ServiceStart(string serviceName)
       {
           using (ServiceController control = new ServiceController(serviceName))
           {
               if (control.Status == ServiceControllerStatus.Stopped)
               {
                   control.Start();
               }
           }
       }

       //停止服务
       public static void ServiceStop(string serviceName)
       {
           using (ServiceController control = new ServiceController(serviceName))
           {
               if (control.Status == ServiceControllerStatus.Running)
               {
                   control.Stop();
               }
           }
       }
   }

添加winform项目对服务的引用,添加exe文件

右击winform项目添加新项目->应用程序清单文件

打开该文件,并将<requestedExecutionLevel level="asInvoker" uiAccess="false" />改为<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />

启动后,将会弹出如下所示的窗体(有的系统因UAC配置有可能不显示),需要用管理员权限打开

可以打开任务管理器,运行项目,安装运行可以查看服务的状态

调试服务

调试服务,需要将服务进程添加到需要调试的程序当中,可以设置在创建的服务项目里,在OnStop设置断点

点击调试-附加到进程

一般名称和执行exe名称一致,并不是设置的服务名

停止服务,查看断点,调试代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/623402.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Five86-1 靶机实战

Nmap: 1.存活探测&#xff1a; nmap -sn 192.168.20.1/24 2.端口探测&#xff1a; nmap -sS -p- 192.168.20.131 3.服务探测&#xff1a; nmap -sVC -p 22,80,10000 -O --version-all 192.168.20.131 这里发现 10000 端口也是http服务。 服务漏扫&#xff1a; nmap -p 2…

Shell——执行方式详解

一.什么是shell Shell 是一个计算机程序&#xff0c;它提供了用户与操作系统内核之间的交互界面。它接受来自用户或其他程序的命令&#xff0c;并将其转换为操作系统能理解的形式&#xff0c;然后执行这些命令并将结果返回给用户或程序。 Shell 在操作系统中扮演着重要的角色…

Proxmox VE 实现批量增加多网络

前言 实现批量创建多网络&#xff0c;更改主机名称&#xff0c;hosts解析 初始化网卡&#xff0c;主机名称&#xff0c;hosts解析&#xff0c;重启网卡 我的主机六个网卡&#xff0c;使用的有四个网卡&#xff0c;以下一键创建和初始化主机名称我是以硬件的SN号最为主机的名…

[ C++ ] STL---map与set的使用指南

目录 关联式容器 键值对 set简介 set的常用接口 构造函数 set的迭代器 set的容量 修改相关接口 find()函数 insert()函数 erase()函数 clear()函数 count函数 lower_bound()函数 upper_bound()函数 multiset简介 map简介 map的常用接口 构造函数 map的迭代…

BK9524 BEKEN博通 无线麦克风接收芯片 提供配置工具软件

BK9524 系列 无线麦克风跳频芯片 24bit/48KHz 数字无线传输 2.5 毫秒的传输延迟 数字加密/绝无串音 无线空中对码/发射跳频/接收自动跟踪 免软件开发的 TURN-KEY 方案 接收芯片 BK9524 特点&#xff1a; 1. 接收灵敏度&#xff1a;-96 dBm(V 段)&#xff1b; -94 dBm (…

《深入Linux内核架构》第2章 进程管理和调度 (6)

目录 2.8 调度器增强 2.8.1 SMP调度 2.8.2 调度域和控制组 2.8.3 内核抢占和低延迟相关工作 2.9 小结 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;订阅后续文章。 2.8 调度器增强 2.8.1 SMP调度 进程迁移&#xff1a; 含义&#xff1a;把进程从一个CPU就绪队…

BCLinux8U6系统基线加固致无法su的问题分析

本文对BCLinux8U6系统进行基线加固致无法su的问题分析。 一、问题现象 对BCLinux8U6系统进行基线加固&#xff0c;su切换用户失败&#xff0c;报错信息如下&#xff1a; [ABCDlocalhost ~]$ su - 密码&#xff1a; su: 模块未知 二、问题分析 1、错误排查 出错前&#xf…

CubelMX点灯

工程配置 开发板led引脚图 工程io配置 配置PB5 为输出 配置 PE5 为输出 时钟配置 写测试代码 配置工程&#xff0c;下载运行。 参考链接 STM32入门教程-1.点灯_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1dC41147eL/?spm_id_from333.788&vd_sourcee821a225c7b…

为什么需要网络切片?

网络切片是电信领域的一个突破性概念&#xff0c;它允许将物理网络基础设施划分为多个虚拟网络&#xff0c;称为切片。每个切片作为一个独立的网络运行&#xff0c;拥有自己的专用资源和定制的特性&#xff0c;满足不同应用、行业或用户的特定需求。 将网络切片视为在共享物理…

Redis-键值设计

Redis-键值设计 1.设置key的规范 遵循基本格式&#xff1a;【业务名称】&#xff1a;【数据名】&#xff1a;【id】 可读性强&#xff0c;在客户端的情况下使用:如果前缀相同会分目录层级长度不超过44字节 string数据结构的三种类型&#xff0c;在44字节之内是embstring 内存…

栈的解释和实现

目录 1.栈的基本概念&#xff1a; 2. 栈的基本功能&#xff1a; 3.栈的实现&#xff1a; 3.1 存储结构&#xff1a;&#xff08;顺序表&#xff09; 3.2 初始化&#xff1a;&#xff08;void StackInit(stack*tmp)&#xff09; 3.3 栈的销毁&#xff1a;&#xff08;void …

ObjectiveC-第一部分-基础入门-学习导航

专题地址:MacOS一站式程序开发系列专题 第一部分:基础入门学习导航 OSX-01-Mac OS应用开发概述:简单介绍下MacOS生态、Xcode使用以及使用Xcode创建app的方法OSX-02-Mac OS应用开发系列课程大纲和章节内容设计:介绍下此系列专题的文章内容组织形式以及此系列专题的覆盖内容…