zoukankan      html  css  js  c++  java
  • C#创建服务及使用程序自动安装服务

    .NET创建一个即是可执行程序又是Windows服务的exe

    不得不说,.NET中安装服务很麻烦,即要创建Service,又要创建ServiceInstall,最后还要弄一堆命令来安装和卸载。

    今天给大家提供一种方式,直接使用我们的程序来安装/卸载服务,并且可以让一个exe即能直接运行也行安装为windows服务


    首先我们创建一个Windows应用程序,(我创建的是控制台程序,WinForm也一样)

    接下来在项目中添加一个Windows服务类

    然后双击“MainService.cs”,在上面点右键“打开代码”

    这里面写服务的具体实现,以下是我写的示例代码

    复制代码
     partial class MainService : ServiceBase
        {
            public MainService()
            {
                InitializeComponent();
            }
    
            protected override void OnStart(string[] args)
            {
                // TODO:  在此处添加代码以启动服务。
                System.IO.File.AppendAllText("D:\log.txt", "服务已启动……" + DateTime.Now.ToString());
            }
    
            protected override void OnStop()
            {
                // TODO:  在此处添加代码以执行停止服务所需的关闭操作。
                System.IO.File.AppendAllText("D:\log.txt", "服务已停止……" + DateTime.Now.ToString());
            }
        }
    复制代码

    然后我们改程序入口Main方法,让其在启动时识别是Windows应用程序还是Windows服务,如果是应用程序就执行应用程序的代码,如果是服务就执行MainService的代码

    如果是服务,我给了一个"s"参数,如果有这个参数就证明是Windows服务,然后启动MainService

    复制代码
     static void Main(string[] args)
            {
               //如果传递了"s"参数就启动服务
                if (args.Length > 0 && args[0] == "s")
                {
                   //启动服务的代码,可以从其它地方拷贝
                    ServiceBase[] ServicesToRun;
                    ServicesToRun = new ServiceBase[] 
                    { 
                        new MainService(),
                    };
                    ServiceBase.Run(ServicesToRun);
                }
                else
                {}
    复制代码

    然后,我们再实现应用程序的功能,就是上面的else语句块,应用程序的功能就是安装/卸载服务,可以用windows自带的sc命令来进行安装和卸载,具体代码如下:

    复制代码
                    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");
                            Console.WriteLine("安装成功");
                            Console.Read();
                            break;
                        case 2:
                            Process.Start("sc", "delete myserver");
                            Console.WriteLine("卸载成功");
                            Console.Read();
                            break;
                        case 3: break;
                    }
    复制代码

    这样我们就实现了一个即是可执行程序又是Windows服务的应用程序

    Main方法完整代码如下

    复制代码
     static void Main(string[] args)
            {
                if (args.Length > 0 && args[0] == "s")
                {
                    ServiceBase[] ServicesToRun;
                    ServicesToRun = new ServiceBase[] 
                    { 
                        new MainService(),
                    };
                    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");
                            Console.WriteLine("安装成功");
                            Console.Read();
                            break;
                        case 2:
                            Process.Start("sc", "delete myserver");
                            Console.WriteLine("卸载成功");
                            Console.Read();
                            break;
                        case 3: break;
                    }
                }
            }
    复制代码

    至此,程序已基本写完,接下来我们测试一下

    直接双击ServiceOrApp.exe

    输入 1

    提示安装成功,然后运行“services.msc"打开服务管理器

    可以发现我们的服务已安装成功,然后右键启动服务

    成功启动

    然后去D盘看看log.txt

    说明服务执行正常

    我们再停止服务

    成功停止后再看看D盘的log.txt文件

    看到以上内容,说明服务启动和停止都没问题(忘了输出换行符 - -!)

    然后我们再试一下卸载服务,还是双击ServiceOrApp.exe,选择2

    提示卸载成功,然后再运行“services.msc"打开服务管理器

    可以看到已经没有”我的服务“了,已成功卸载

    这里安装和卸载主要运用了windows的sc命令,然后使用启动参数来判断是服务还是程序以执行不同的代码

     

    PS:如果本文帮助了你,请分享给更多读者,帮助更多人!谢谢!

     

     

     

     
     
  • 相关阅读:
    POJ 3126 Prime Path
    POJ 2429 GCD & LCM Inverse
    POJ 2395 Out of Hay
    【Codeforces 105D】 Bag of mice
    【POJ 3071】 Football
    【POJ 2096】 Collecting Bugs
    【CQOI 2009】 余数之和
    【Codeforces 258E】 Devu and Flowers
    【SDOI 2010】 古代猪文
    【BZOJ 2982】 combination
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4207366.html
Copyright © 2011-2022 走看看