使用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 > 0 && args[0] == "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 1: //取当前可执行文件路径,加上"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 2: Process.Start("sc", "delete myserver"); Console.WriteLine("卸载成功"); Process.Start("sc", "stop myserver");//有时服务命名删除成功了,但是服务仍然存在,这可能是由于服务正在处于启动状态stop一下就消失了 Console.WriteLine("卸载成功"); Console.Read(); break; case 3: break; } } }