使用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. java调试器

    javac.exe是编译.java文件 java.exe是执行编译好的.class文件 javadoc.exe是生成Java说明文档 jdb.exe是Java调试器 javaprof.exe是剖析工具 ...

  2. EXT4+Struts2 JSON的问题

    ERROR : Class org.apache.struts2.json.JSONWriter can not access a member of class org.springframewor ...

  3. css3浏览器私有属性前缀使用详解

    什么是浏览器私有属性前缀 CSS3的浏览器私有属性前缀是一个浏览器生产商经常使用的一种方式.它暗示该CSS属性或规则尚未成为W3C标准的一部分. 以下是几种常用前缀 -webkit- -moz- -m ...

  4. 复利计算1.0,2.0,3.0(java)

    程序源代码: import java.util.Scanner; public class ch { public static void main(String[] args) { Scanner ...

  5. CentOS 7 U盘安装问题解决

    最近期待以久的CentOS 7正式版终于发布了,在家里无聊,所以就打算在我的小Y上安装一下,由于笔记本原来有安装Windows 7 操作系统,考虑使用的需求,所以决定安装双系统: 1.         ...

  6. PHP中普通属性和静态属性

    普通属性(实例属性): 实例的单词为:instance 实例,其实也叫做“对象”: 普通(实例)属性,就是一个可以在该类实例化出的对象上使用的属性! 定义形式: class  类名{ var  $属性 ...

  7. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

  8. Linux(三)高级文本处理命令

    一.cut (cut 命令可以从一个文本文件或者文本流中提取文本列 ) 1.cut语法 cut -d '分隔字符' -f fields         用于有特定分隔字符 cut  -c 字符区间   ...

  9. NOIP2015Day1T3斗地主(DFS)

    这类题...真的写不动T T 首先可以发现没有顺子的话出牌次数是一定的, 换句话说只有顺子会影响出牌次数. 所以可以暴搜出所有顺子的方案, 搜完之后记忆化搜索求一下a张1张同色牌, b张2张同色牌,c ...

  10. 【learning】01分数规划

    问题描述 首先分数规划是一类决策性问题 一般形式是: \[ \lambda=\frac{f(x)}{g(x)} \] 其中\(f(x)\)和\(g(x)\)都是连续的实值函数,然后要求\(\lambd ...