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