c# windows server安装启动与卸载

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

方式一:

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

其中install.bat文件如下:

@echo off 
@title 安装windows服务
set curdir=%~dp0 
cd /d %curdir%
%SystemRoot%Microsoft.NETFrameworkv4.0.30319installutil.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.NETFrameworkv4.0.30319installutil.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; 
        } 
    } 
}       
     
原文地址:https://www.cnblogs.com/lcawen/p/7722018.html