使用installutil.exe安装卸载服务时,由于需要指向服务的全路径,由于生成目录往往不是服务发布的最终目录,很不便利,下面介绍两种方式方便操作:

方式一:

项目中加入install.bat与uninstall.bat文件,设置为始终复制,生成后,在debug\bin下双击install.bat安装启动服务,双击uninstall.bat卸载服务,需要管理员权限时右击以管理员运行。

其中install.bat文件如下:

@echo off
@title 安装windows服务
set curdir=%~dp0
cd /d %curdir%
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe 服务.exe
echo==============================================================
echo=
echo windows服务程序安装
echo=
echo==============================================================
@echo off
net start 服务名
pause

其中的

set curdir=%~dp0
cd /d %curdir%

是通过获取当前bat文件所在的目录,然后cd 到该目录来解决该问题

uninstall.bat文件如下:

@echo off
@title 卸载Windows服务
set curdir=%~dp0
cd /d %curdir%
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u 服务.exe
echo==============================================================
echo=
echo windows服务卸载
echo=
echo==============================================================
@echo off
pause

方式二:

使用windows自带的sc命令安装或卸载服务

正常创建windows server时,main函数如下:

static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new myService()//服务
};
ServiceBase.Run(ServicesToRun);//在服务控制管理器 (SCM) 中注册多项服务的可执行文件。
}
}

然后我们改程序入口Main方法,让其在启动时识别是Windows应用程序还是Windows服务,如果是应用程序就执行应用程序的代码,如果是服务就执行MainService的代码,如果是服务,我给了一个"s"参数,如果有这个参数就证明是Windows服务,然后启动MainService,更改后的Main如下:

static void Main(string[] args)
{
//有参数,并且第一个参数时s时,执行服务注册
if (args.Length > && args[] == "s")
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyService()//服务
};
ServiceBase.Run(ServicesToRun);
}
else//不含参数就正常运行,这里不含参数运行时,判断是安装还是卸载
{
Console.WriteLine("这是Windows应用程序");
Console.WriteLine("请选择,[1]安装服务 [2]卸载服务 [3]退出");
var rs = int.Parse(Console.ReadLine());
switch (rs)
{
case :
//取当前可执行文件路径,加上"s"参数,证明是从windows服务启动该程序
var path = Process.GetCurrentProcess().MainModule.FileName + " s";
Process.Start("sc", "create myserver binpath= \"" + path + "\" displayName= 我的服务 start= auto");
//其中myserver是安装后的服务名称,displayName为安装后服务的描述,安装指向的服务文件对应的是path
Console.WriteLine("安装成功");
Process.Start("sc","start myserver");
Console.WriteLine("服务启动成功");
Console.Read();
break;
case :
Process.Start("sc", "delete myserver");
Console.WriteLine("卸载成功");
Process.Start("sc", "stop myserver");//有时服务命名删除成功了,但是服务仍然存在,这可能是由于服务正在处于启动状态stop一下就消失了
Console.WriteLine("卸载成功");
Console.Read();
break;
case :
break;
}
}
}
     

c# windows server安装启动与卸载的更多相关文章

  1. windows server 安装 mysql – 畅玩Coding

    原文:windows server 安装 mysql – 畅玩Coding windows server 安装 mysql 2018年12月11日2018年12月11日 admin 下载:https: ...

  2. Windows server 安装和配置zabbix agent

    1.下载Windows 平台的zabbix agent 先到官网下载zabbix_agentd监控客户端软件安装包(windows操作系统客户端),客户端版本尽量与服务器版本一致,下载地址:http: ...

  3. Windows Server 安装 BitLocker

    打开PowerShell(管理员): C:\> Install-WindowsFeature BitLocker -Restart 安装好后,系统会自动重新启动. Windows Server ...

  4. windows server 安装之后需要做的操作

    一.运行windows update安装更新 提示: 若一直停留在“正在检查更新”,请参考https://answers.microsoft.com/zh-hans/windows/forum/win ...

  5. windows server安装zabbix-agent

    1.准备安装包: 下载链接:https://www.zabbix.com/downloads/3.4.0/zabbix_agents_3.4.0.win.zip 2.在C盘下创建一个zabbix目录, ...

  6. windows服务安装启动报错误1053:服务没有及时响应启动或控制请求

    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0&qu ...

  7. mongodb在windows下安装启动

    mongodb安装 mongodb配置 创建几个文件夹具体如下:数据库路径(\data\db\目录).日志路径(\data\log\目录)和日志文件(mongod.log文件)c:\data\log\ ...

  8. windows server 2012启动进入cmd解决方法

    感谢网友http://sns.yhjy.cn/u/XperiaZ/Blog/t-4748 由于删除了framework 4.5引起的. windows server 2012默认安装framework ...

  9. windows server 安装phpVirtualBox web服务

    这是我在Windows server 2012 下的安装过程 (1) 安装virtualbox (2) 安装IIS和PHP, 参考: https://msdn.microsoft.com/zh-cn/ ...

随机推荐

  1. mininet实验 脚本实现控制交换机行为

    写在前面 本文参考 通过这个实验,我学习到了另一种下流表的方式. 下流表有两种方式(我目前了解): 通过controller下发. 通过OvS提供的API直接向OvS交换机下流表. 本实验脚本已经把相 ...

  2. a5

    今日内容: 今天主要还是素材的查找,图标的制作以及调整. 明日计划: 主要还是完成图标,尽可能的美化 困难: 一个是直男式的审美吧,另一个是PS的技术还不够深

  3. DP--HDU 1003(最大子串和)

    问题描述:          给定整数A1, A2,--AN (可能有负数),求I到j的最大值. 例如:          -2, 11, -4, 13, -5, -2时答案为20 对于这个问题的算法 ...

  4. Spring – 缓存注解

    Spring缓存抽象概述 Spring框架自身并没有实现缓存解决方案,但是从3.1开始定义了org.springframework.cache.Cache和org.springframework.ca ...

  5. 【Leetcode】445. Add Two Numbers II

    You are given two non-empty linked lists representing two non-negative integers. The most significan ...

  6. 关于解决java读取excel文件遇空行抛空指针的问题 !

    关于解决java读取excel文件遇空行抛空指针的问题 ! package exceRead; import java.io.File; import java.io.FileInputStream; ...

  7. 【C++】new和delete表达式与内存管理

    new和delete表达式可以用来动态创建和释放单个对象,也可以用来动态创建和释放动态数组. 定义变量时,必须指定其数据类型和名字.而动态创建对象时,只需指定其数据类型,而不必为该对象命名.new表达 ...

  8. 【bzoj5157】[Tjoi2014]上升子序列 树状数组

    题目描述 求一个数列本质不同的至少含有两个元素的上升子序列数目模10^9+7的结果. 题解 树状数组 傻逼题,离散化后直接使用树状数组统计即可.由于要求本质不同,因此一个数要减去它前一次出现时的贡献( ...

  9. 转--- 秒杀多线程第六篇 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  10. shell的tr命令

    tr,translate的简写,即翻译的意思.主要用来从标准输入中通过替换或删除操作进行字符转换.只接受标准输入,不接受文件参数. 命令语法: tr [–c/d/s/t] [SET1] [SET2] ...