C# 服务 调试、正式使用两便的模板

it2025-10-11  7

转自: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; }     }     } } http://files.cnblogs.com/MysticBoy/MSG2DBServer.rar

转载于:https://www.cnblogs.com/bennylam/archive/2009/10/27/1590385.html

相关资源:数据结构—成绩单生成器
最新回复(0)