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

    常驻内存的程序是一些监控或者数据处理的项目中最常用的程序, 有的人做成控制台程序,长期开着, 可是这要登录进去,然后自动运行,必须保持用户在登录状态,这样唯一的好处是能看到调试信息(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; }
        }

        
        
         
        }

    }

    /Files/MysticBoy/MSG2DBServer.rar
  • 相关阅读:
    腾讯开放平台 手机QQ登录 错误码:110406 解决办法
    比较酷的安卓软件
    Top 10 Methods for Java Arrays
    Feathers UI 性能优化
    Starling中通过PivotX 和 PivotY 修改原点
    Adobe AIR 中为不同尺寸和分辨率屏幕适配
    Feathers组件的宽度或高度属性,为什么我得到的值是0
    "Type Coercion failed" Error in FlashBuilder 4.7
    正则表达式中的特殊字符
    单体内置对象 Global 和 Math
  • 原文地址:https://www.cnblogs.com/MysticBoy/p/1140655.html
Copyright © 2011-2022 走看看