现在的位置: 首页 > 综合 > 正文

.Net新建、卸载、调试Windows服务

2012年05月27日 ⁄ 综合 ⁄ 共 3234字 ⁄ 字号 评论关闭

      由于项目里涉及到与其他系统的接口数据传递,所以采取了新建Windows服务的方式来同步接口数据。内容很简单,之所以把他记下来,是因为加深下自己的影响,也留个备份。
      我们直接就上步骤吧:
      第一,我们建立一个叫MyService的Windows程序。之后我们把Service1改名为MyService。
      第二,声明一个线程,  private Thread thd;;同时在MyService的OnStart方法里加入以下测试代码:
  if (thd == null || thd.ThreadState != System.Threading.ThreadState.Running)
    {
       thd = new Thread(new ThreadStart(RunApp));
       thd.Start();
    }
   第三,加入以下方法代码,代码主要是实现寻找进程devenv.exe写入到日志文件里面。      
    public void RunApp()
        {
            while (true)
            {
                int i = 0;
                foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
                {
                    if (p.ProcessName == "devenv")
                    {
                       LogLocation = System.Windows.Forms.Application.StartupPath + "\\" + "log";
                        LogMsg("测试", "找到进程devenv.exe");
                    }
                }
            }
            Thread.Sleep(1000);
        }
        public static string LogLocation = "";
        public static bool LogMsg(string ID, DateTime LogDate, string Msg)
        {
            try
            {
                if (ID == null || ID.Trim() == "")
                    return false;
                if (LogLocation == "")
                    return false;

                string path = LogLocation + "\\" + ID + "\\" + LogDate.ToString("yyyyMM");
                string file = path + "\\" + LogDate.ToString("yyyyMMdd") + ".txt";
                if (!System.IO.Directory.Exists(path))
                    System.IO.Directory.CreateDirectory(path);
                if (!System.IO.File.Exists(file))
                    System.IO.File.Create(file).Close();

                System.IO.StreamWriter sw = new System.IO.StreamWriter(file, true);
                sw.WriteLine(FormatStr(Msg));
                sw.Close();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        private static string FormatStr(string msg)
        {
            return "[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "]" + msg;
        }
        public static bool LogMsg(string ID, string Msg)
        {
            return LogMsg(ID, DateTime.Now, Msg);
        } 
     第四,在OnStop方法里写入以下代码:
    if (thd != null)
      {
          thd.Abort();
          thd = null;
     }
   我们的这个服务代码就已经写完了,接下来我们要做的工作就是注册该服务。
   第五,点击MyService.cd查看设计器,再点加右键会出现添加安装程序。点击以后会出现serviceProcessInstaller1和serviceInstaller1两个组件。把serviceInstaller1的serviceName改成MyService,这里有两个地方需要注意.一个是StartType,有三种选择自动,手动,禁用.如果想要自动启动,那么遍选择Automatic即可.另一个需要注意的属性是Account,选择用户,一般情况下,我们选择Local System即可.。在Program.cs文件中有段用于启动服务,的代码:
 static void Main()
        {
            ServiceBase[] ServicesToRun;

            // 同一进程中可以运行多个用户服务。若要将
            // 另一个服务添加到此进程中,请更改下行以
            // 创建另一个服务对象。例如,
            //
            //   ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
            //
            ServicesToRun = new ServiceBase[] { new MyService() };

            ServiceBase.Run(ServicesToRun);
        }

    生成该解决方案。
   第六,安装服务,打开Visual Studio 2005 命令提示,切换到你程序bin\Debug目录下,输入installutil MyService.exe,之后提示安装成功。我们可以到我们服务里去找刚才我们注册的服务了,找到之后启动它,那么在进程里就能找到MyService.exe这个进程了。到\bin\Debug目录下,找是否有个log文件里存着今日的文本文件。
      第七,卸载服务,切换到你程序bin\Debug目录下,输入installutil /u MyService.exe,就行了。
      第八,调试服务,启动Microsoft Visual Studio 2005的调试,同时启动调试-》附加到进程,点击显示所有用户进程,找到叫MyService.exe的进程,点加附加,我们就可以在我们的解决方案里设置断点调试了。over!谢谢!

抱歉!评论已关闭.