zoukankan      html  css  js  c++  java
  • C# 服务 调试、正式使用两便的模板

    转自:http://www.mysticboy.cn/article.asp?id=100

    常驻内存的程序是一些监控或者数据处理的项目中最常用的程序, 有的人做成控制台程序,长期开着, 可是这要登录进去,然后自动运行,必须保持用户在登录状态,这样唯一的好处是能看到调试信息(console.writeline输出的东西),很多人都这么干, 我就碰到好几个大项目,比如某省的高速公路收费等。
    服务的好处和不好处,一对比就出来了, 服务不用用户登录就能后台运行,但是看不到实时信息。 很不爽。 所以我在这里献丑,弄了一个二转子。呵呵。
    这个程序即可以作为服务,也可以作为控制台, 你想调试的时候 加参数/debug 你想作为服务的时候  /install 然后后台运行。
    如果你感兴趣, 请看下面代码。  因为代码比描述来的更直接。 哈哈
    新建控制台项目  添加一个 叫MSG2DB的类文件, 粘贴如下内容。
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.ServiceProcess;
    using System.Reflection;
    namespace MSG2DBServer
    {
        public class MSG2DB : ServiceBase
        {
            public MSG2DB()
            {
                this.ServiceName = MyServiceName;
            }
            public  static  string MyServiceName
            {
                get { return   Assembly.GetExecutingAssembly().GetName().Name; }
            }
            protected override void OnStart(string[] args)
            {
                // TODO: 在此处添加代码以启动服务。
                  MSG2DBWorker.Do();
            }
            protected override void OnStop()
            {
                // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
               MSG2DBWorker.PleaseStop=true ;
            }
        }
    }
    修改 Program.cs的代码为 如下代码
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.ServiceProcess;
    using System.Reflection;
    namespace MSG2DBServer
    {
        class Program
        {
            static void Main(string[] args)
            {
                bool RunAsService = true  ;
                if (args.Length > 0)
                {
                    System.Runtime.p
                    RunAsService=false ;
                    switch (args[0].ToLower())
                    {
                        case  "/debug":
                            MSG2DBWorker.Do();
                            break;
                        case "/install":
                         Console.WriteLine("正在准备安装服务");
                         Console.WriteLine(CommandDo.Execute(string.Format(
                                "sc create {0}  binPath= \"{1}\"  start= auto",
                                MSG2DB.MyServiceName, Assembly.GetExecutingAssembly().Location
                                )));
                         Console.WriteLine(CommandDo.Execute(" sc start " + MSG2DB.MyServiceName));
                         Console.WriteLine("安装完成");
                            break;
                        case "/uninstall":
                            Console.WriteLine("正在卸载安装服务");
                            Console.WriteLine(CommandDo.Execute("sc stop " + MSG2DB.MyServiceName));
                            Console.WriteLine(CommandDo.Execute("sc delete " + MSG2DB.MyServiceName));
                            Console.WriteLine("卸载完成");
                            break;
                        case "/?":
                        case "/help":
                            Console.WriteLine("/install 安装此服务  /uninstall 卸载此服务  /? 或者 /help 显示当前信息 ");
                            break;
                        default:
                            Console.WriteLine(CommandDo.Execute("sc " + args[0] + " " + MSG2DB.MyServiceName));
                            break;
                    }
                  }
                  if (RunAsService)
                  {
                      ServiceBase[] ServicesToRun;
                      ServicesToRun = new ServiceBase[] { new MSG2DB() };
                      ServiceBase.Run(ServicesToRun);
                  }
            }
        }
    }
    添加一个执行dos命令的文件,呵呵, 网上找的
    using System;
    using System.Text;
    using System.Diagnostics;
    namespace MSG2DBServer
    {
    /**//// <summary>
    /// DOS命令输出类
    /// </summary>
    public class CommandDo
    {
      /**//// <summary>
      /// 执行DOS命令,返回DOS命令的输出
      /// </summary>
      /// <param name="dosCommand">dos命令</param>
      /// <returns>返回输出,如果发生异常,返回空字符串</returns>
      public static string Execute(string dosCommand)
      {
       return Execute(dosCommand, 6 * 1000);
      }
      /**//// <summary>
      /// 执行DOS命令,返回DOS命令的输出
      /// </summary>
      /// <param name="dosCommand">dos命令</param>
      /// <param name="milliseconds">等待命令执行的时间(单位:毫秒),如果设定为0,则无限等待</param>
      /// <returns>返回输出,如果发生异常,返回空字符串</returns>
      public static string Execute(string dosCommand, int milliseconds)
      {
       string output = "";     //输出字符串
       if (dosCommand != null && dosCommand != "")
       {
        Process process = new Process();     //创建进程对象
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = "cmd.exe";      //设定需要执行的命令
        startInfo.Arguments = "/C " + dosCommand;   //设定参数,其中的“/C”表示执行完命令后马上退出
        startInfo.UseShellExecute = false;     //不使用系统外壳程序启动
        startInfo.RedirectStandardInput = false  ;   //不重定向输入
        startInfo.RedirectStandardOutput = true;   //重定向输出
        startInfo.CreateNoWindow = true;     //不创建窗口
        process.StartInfo = startInfo;
        try
        {
         if (process.Start())       //开始进程
         {
          if (milliseconds == 0)
           process.WaitForExit();     //这里无限等待进程结束
          else
           process.WaitForExit(milliseconds);  //这里等待进程结束,等待时间为指定的毫秒
          output = process.StandardOutput.ReadToEnd();//读取进程的输出
         }
        }
        catch
        {
        }
        finally
        {
         if (process != null)
          process.Close();
        }
       }
       return output;
      }
    }
    }
    添加 一个你的程序文件 , 这个文件里 我们将写入 我们要执行的代码。 比如循环啦。 等等哈吉玛塔的东西
    using System;
    using System.Collections.Generic;
    using System.Text;
    namespace MSG2DBServer
    {
        public static class MSG2DBWorker
        {
           public static  void Do()
           {
               do
               {
                   System.Threading.Thread.Sleep(100);
               } while (PleaseStop==false );
               Stoped = true;
           }
           private static bool _PleaseStop;
           /**//// <summary>
           /// 需要停止
           /// </summary>
           public static bool PleaseStop
        {
            get { return _PleaseStop;}
            set { _PleaseStop = value;}
        }
           private static bool _Stoped;
        /**//// <summary>
        /// 我停止了
        /// </summary>
           public static bool Stoped
        {
            get { return _Stoped; }
            set { _Stoped = value; }
        }
        }
    }
    https://files.cnblogs.com/MysticBoy/MSG2DBServer.rar

  • 相关阅读:
    continue语句及小案例
    break语句和break版猜数字游戏
    python 用while语句打印99乘法表
    python2中引入python3中print函数的语法的语句
    【猜数字 小游戏】
    【while循环】
    代码块和缩进
    使用vs2015编写c语言的方法
    This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details
    矩阵相乘法则和技巧
  • 原文地址:https://www.cnblogs.com/bennylam/p/1590385.html
Copyright © 2011-2022 走看看