rainbowzc

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

posted on 2010-08-11 12:40  ct  阅读(384)  评论(0编辑  收藏  举报