C# 创建以及安装服务

关于WIndows服务的介绍,之前写过一篇: http://blog.csdn.net/yysyangyangyangshan/article/details/7295739 。可能这里对如何写一个服务不是很详细。现在纯用代码的形式介绍一下windows服务是如何开发和安装的。
开发环境:Win7 32位;工具:visualstudio2010。
因为win7自带的就有.net环境,算是偷一下懒吧。因为无论是手动安装或程序安装都要用到。一个目录(默认C盘为操作系统的情况):C:\Windows\Microsoft.NET\Framework,如果你的代码是.net2.0:C:\Windows\Microsoft.NET\Framework\v2.0.50727;4.0:C:\Windows\Microsoft.NET\Framework\v4.0.30319。
下面看一下代码:
一、创建windows服务
如图新建一个Windows服务

进入程序如图

空白服务如下
[csharp]  view plain  copy
  1. public partial class Service1 : ServiceBase  
  2.    {  
  3.        System.Threading.Timer recordTimer;  
  4.   
  5.   
  6.        public Service1()  
  7.        {  
  8.            InitializeComponent();  
  9.        }  
  10.   
  11.   
  12.        protected override void OnStart(string[] args)  
  13.        {  
  14.        }  
  15.   
  16.   
  17.        protected override void OnStop()  
  18.        {  
  19.        }  
  20.    }  
只要在OnStart里完成你的功能代码即可。本例中我们做一个定时向本地文件写记录的功能。
如图

创建一个类,用户写文件,
[csharp]  view plain  copy
  1. public class FileOpetation  
  2.    {  
  3.        /// <summary>  
  4.        /// 保存至本地文件  
  5.        /// </summary>  
  6.        /// <param name="ETMID"></param>  
  7.        /// <param name="content"></param>  
  8.        public static void SaveRecord(string content)  
  9.        {  
  10.            if (string.IsNullOrEmpty(content))  
  11.            {  
  12.                return;  
  13.            }  
  14.   
  15.   
  16.            FileStream fileStream = null;  
  17.   
  18.   
  19.            StreamWriter streamWriter = null;  
  20.   
  21.   
  22.            try  
  23.            {  
  24.                string path = Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, string.Format("{0:yyyyMMdd}", DateTime.Now));  
  25.   
  26.   
  27.                using (fileStream = new FileStream(path, FileMode.Append, FileAccess.Write))  
  28.                {  
  29.                    using (streamWriter = new StreamWriter(fileStream))  
  30.                    {  
  31.                        streamWriter.Write(content);  
  32.   
  33.   
  34.                        if (streamWriter != null)  
  35.                        {  
  36.                            streamWriter.Close();  
  37.                        }  
  38.                    }  
  39.   
  40.   
  41.                    if (fileStream != null)  
  42.                    {  
  43.                        fileStream.Close();  
  44.                    }  
  45.                }  
  46.            }  
  47.            catch { }  
  48.        }  
  49.    }  
那么在Service1中调用,
[csharp]  view plain  copy
  1. public partial class Service1 : ServiceBase  
  2.    {  
  3.        System.Threading.Timer recordTimer;  
  4.   
  5.   
  6.        public Service1()  
  7.        {  
  8.            InitializeComponent();  
  9.        }  
  10.   
  11.   
  12.        protected override void OnStart(string[] args)  
  13.        {  
  14.            IntialSaveRecord();  
  15.        }  
  16.   
  17.   
  18.        protected override void OnStop()  
  19.        {  
  20.            if (recordTimer != null)  
  21.            {  
  22.                recordTimer.Dispose();  
  23.            }  
  24.        }  
  25.   
  26.   
  27.        private void IntialSaveRecord()  
  28.        {  
  29.            TimerCallback timerCallback = new TimerCallback(CallbackTask);  
  30.   
  31.   
  32.            AutoResetEvent autoEvent = new AutoResetEvent(false);  
  33.   
  34.   
  35.            recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 10000, 60000 * 10);  
  36.        }  
  37.   
  38.   
  39.        private void CallbackTask(Object stateInfo)  
  40.        {  
  41.            FileOpetation.SaveRecord(string.Format(@"当前记录时间:{0},状况:程序运行正常!", DateTime.Now));  
  42.        }  
  43.    }  
这样服务算是写的差不多了,下面添加一个安装类,用于安装。
如图,在service1上右键-添加安装程序,

如图,添加一个安装程序,

如图,添加完成后,

设置相应的属性,给serviceInstaller1设置属性,主要是描述信息。如图,

给serviceProcessInstaller1设置,主要是account。一般选localsystem,如图,

这样服务已经写好了。那么如何添加到windows服务里面去呢。除了之前说过的用CMD,InstallUtil.exe和服务的exe文件进行手动添加。这些可以用代码来实现的。当然主要过程都是一样的。代码实现也是使用dos命令来完成的。
二、代码安装Windows服务
上面写好的服务,最终生成的是一个exe文件。如图,

安装程序安装时需要用到这个exe的路径,所以方便起见,将这个生成的exe文件拷贝至安装程序的运行目录下。

安装代码, 

[csharp]  view plain  copy
  1. class Program  
  2.     {  
  3.         static void Main(string[] args)  
  4.         {  
  5.              Application.EnableVisualStyles();  
  6.   
  7.   
  8.             Application.SetCompatibleTextRenderingDefault(false);  
  9.   
  10.   
  11.             string sysDisk = System.Environment.SystemDirectory.Substring(0,3);  
  12.   
  13.   
  14.             string dotNetPath = sysDisk + @"WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe";//因为当前用的是4.0的环境  
  15.   
  16.   
  17.             string serviceEXEPath = Application.StartupPath+@"\MyFirstWindowsService.exe";//把服务的exe程序拷贝到了当前运行目录下,所以用此路径  
  18.   
  19.   
  20.             string serviceInstallCommand = string.Format(@"{0}  {1}", dotNetPath, serviceEXEPath);//安装服务时使用的dos命令  
  21.   
  22.   
  23.             string serviceUninstallCommand = string.Format(@"{0} -U {1}", dotNetPath, serviceEXEPath);//卸载服务时使用的dos命令  
  24.   
  25.   
  26.             try  
  27.             {  
  28.                 if (File.Exists(dotNetPath))  
  29.                 {  
  30.                     string[] cmd = new string[] { serviceUninstallCommand };  
  31.   
  32.   
  33.                     string ss = Cmd(cmd);  
  34.   
  35.   
  36.                     CloseProcess("cmd.exe");  
  37.                 }  
  38.   
  39.   
  40.             }  
  41.             catch  
  42.             {  
  43.             }  
  44.   
  45.   
  46.             Thread.Sleep(1000);  
  47.   
  48.   
  49.             try  
  50.             {  
  51.                 if (File.Exists(dotNetPath))  
  52.                 {  
  53.                     string[] cmd = new string[] { serviceInstallCommand };  
  54.   
  55.   
  56.                     string ss = Cmd(cmd);  
  57.   
  58.   
  59.                     CloseProcess("cmd.exe");  
  60.                 }  
  61.   
  62.   
  63.             }  
  64.             catch  
  65.             {  
  66.   
  67.   
  68.             }  
  69.   
  70.   
  71.             try  
  72.             {  
  73.                 Thread.Sleep(3000);  
  74.   
  75.   
  76.                 ServiceController sc = new ServiceController("MyFirstWindowsService");  
  77.   
  78.   
  79.                 if (sc != null && (sc.Status.Equals(ServiceControllerStatus.Stopped)) ||  
  80.   
  81.   
  82.                           (sc.Status.Equals(ServiceControllerStatus.StopPending)))  
  83.                 {  
  84.                     sc.Start();  
  85.                 }  
  86.                 sc.Refresh();  
  87.             }  
  88.             catch  
  89.             {  
  90.             }  
  91.         }  
  92.   
  93.   
  94.         /// <summary>  
  95.         /// 运行CMD命令  
  96.         /// </summary>  
  97.         /// <param name="cmd">命令</param>  
  98.         /// <returns></returns>  
  99.         public static string Cmd(string[] cmd)  
  100.         {  
  101.             Process p = new Process();  
  102.             p.StartInfo.FileName = "cmd.exe";  
  103.             p.StartInfo.UseShellExecute = false;  
  104.             p.StartInfo.RedirectStandardInput = true;  
  105.             p.StartInfo.RedirectStandardOutput = true;  
  106.             p.StartInfo.RedirectStandardError = true;  
  107.             p.StartInfo.CreateNoWindow = true;  
  108.             p.Start();  
  109.             p.StandardInput.AutoFlush = true;  
  110.             for (int i = 0; i < cmd.Length; i++)  
  111.             {  
  112.                 p.StandardInput.WriteLine(cmd[i].ToString());  
  113.             }  
  114.             p.StandardInput.WriteLine("exit");  
  115.             string strRst = p.StandardOutput.ReadToEnd();  
  116.             p.WaitForExit();  
  117.             p.Close();  
  118.             return strRst;  
  119.         }  
  120.   
  121.   
  122.         /// <summary>  
  123.         /// 关闭进程  
  124.         /// </summary>  
  125.         /// <param name="ProcName">进程名称</param>  
  126.         /// <returns></returns>  
  127.         public static bool CloseProcess(string ProcName)  
  128.         {  
  129.             bool result = false;  
  130.             System.Collections.ArrayList procList = new System.Collections.ArrayList();  
  131.             string tempName = "";  
  132.             int begpos;  
  133.             int endpos;  
  134.             foreach (System.Diagnostics.Process thisProc in System.Diagnostics.Process.GetProcesses())  
  135.             {  
  136.                 tempName = thisProc.ToString();  
  137.                 begpos = tempName.IndexOf("(") + 1;  
  138.                 endpos = tempName.IndexOf(")");  
  139.                 tempName = tempName.Substring(begpos, endpos - begpos);  
  140.                 procList.Add(tempName);  
  141.                 if (tempName == ProcName)  
  142.                 {  
  143.                     if (!thisProc.CloseMainWindow())  
  144.                         thisProc.Kill(); // 当发送关闭窗口命令无效时强行结束进程  
  145.                     result = true;  
  146.                 }  
  147.             }  
  148.             return result;  
  149.         }  
  150.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值