C#创建、安装一个Windows服务

C#创建、安装一个Windows服务http://blog.csdn.net/yysyangyangyangshan/article/details/10515035

关于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 print?

  1. public partial class Service1 : ServiceBase
  2. {
  3. System.Threading.Timer recordTimer;
  4. public Service1()
  5. {
  6. InitializeComponent();
  7. }
  8. protected override void OnStart(string[] args)
  9. {
  10. }
  11. protected override void OnStop()
  12. {
  13. }
  14. }
 public partial class Service1 : ServiceBase
    {
        System.Threading.Timer recordTimer;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
        }

        protected override void OnStop()
        {
        }
    }

只要在OnStart里完成你的功能代码即可。本例中我们做一个定时向本地文件写记录的功能。 如图 创建一个类,用户写文件,

[csharp] view plain copy print?

  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. FileStream fileStream = null;
  15. StreamWriter streamWriter = null;
  16. try
  17. {
  18. string path = Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, string.Format("{0:yyyyMMdd}", DateTime.Now));
  19. using (fileStream = new FileStream(path, FileMode.Append, FileAccess.Write))
  20. {
  21. using (streamWriter = new StreamWriter(fileStream))
  22. {
  23. streamWriter.Write(content);
  24. if (streamWriter != null)
  25. {
  26. streamWriter.Close();
  27. }
  28. }
  29. if (fileStream != null)
  30. {
  31. fileStream.Close();
  32. }
  33. }
  34. }
  35. catch { }
  36. }
  37. }
 public class FileOpetation
    {
        /// <summary>
        /// 保存至本地文件
        /// </summary>
        /// <param name="ETMID"></param>
        /// <param name="content"></param>
        public static void SaveRecord(string content)
        {
            if (string.IsNullOrEmpty(content))
            {
                return;
            }

            FileStream fileStream = null;

            StreamWriter streamWriter = null;

            try
            {
                string path = Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, string.Format("{0:yyyyMMdd}", DateTime.Now));

                using (fileStream = new FileStream(path, FileMode.Append, FileAccess.Write))
                {
                    using (streamWriter = new StreamWriter(fileStream))
                    {
                        streamWriter.Write(content);

                        if (streamWriter != null)
                        {
                            streamWriter.Close();
                        }
                    }

                    if (fileStream != null)
                    {
                        fileStream.Close();
                    }
                }
            }
            catch { }
        }
    }

那么在Service1中调用,

[csharp] view plain copy print?

  1. public partial class Service1 : ServiceBase
  2. {
  3. System.Threading.Timer recordTimer;
  4. public Service1()
  5. {
  6. InitializeComponent();
  7. }
  8. protected override void OnStart(string[] args)
  9. {
  10. IntialSaveRecord();
  11. }
  12. protected override void OnStop()
  13. {
  14. if (recordTimer != null)
  15. {
  16. recordTimer.Dispose();
  17. }
  18. }
  19. private void IntialSaveRecord()
  20. {
  21. TimerCallback timerCallback = new TimerCallback(CallbackTask);
  22. AutoResetEvent autoEvent = new AutoResetEvent(false);
  23. recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 10000, 60000 * 10);
  24. }
  25. private void CallbackTask(Object stateInfo)
  26. {
  27. FileOpetation.SaveRecord(string.Format(@"当前记录时间:{0},状况:程序运行正常!", DateTime.Now));
  28. }
  29. }
 public partial class Service1 : ServiceBase
    {
        System.Threading.Timer recordTimer;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            IntialSaveRecord();
        }

        protected override void OnStop()
        {
            if (recordTimer != null)
            {
                recordTimer.Dispose();
            }
        }

        private void IntialSaveRecord()
        {
            TimerCallback timerCallback = new TimerCallback(CallbackTask);

            AutoResetEvent autoEvent = new AutoResetEvent(false);

            recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 10000, 60000 * 10);
        }

        private void CallbackTask(Object stateInfo)
        {
            FileOpetation.SaveRecord(string.Format(@"当前记录时间:{0},状况:程序运行正常!", DateTime.Now));
        }
    }

这样服务算是写的差不多了,下面添加一个安装类,用于安装。 如图,在service1上右键-添加安装程序, 如图,添加一个安装程序, 如图,添加完成后, 设置相应的属性,给serviceInstaller1设置属性,主要是描述信息。如图, 给serviceProcessInstaller1设置,主要是account。一般选localsystem,如图, 这样服务已经写好了。那么如何添加到windows服务里面去呢。除了之前说过的用CMD,InstallUtil.exe和服务的exe文件进行手动添加。这些可以用代码来实现的。当然主要过程都是一样的。代码实现也是使用dos命令来完成的。 二、代码安装Windows服务 上面写好的服务,最终生成的是一个exe文件。如图, 安装程序安装时需要用到这个exe的路径,所以方便起见,将这个生成的exe文件拷贝至安装程序的运行目录下。

安装代码,

[csharp] view plain copy print?

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

            Application.SetCompatibleTextRenderingDefault(false);

            string sysDisk = System.Environment.SystemDirectory.Substring(0,3);

            string dotNetPath = sysDisk + @"WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe";//因为当前用的是4.0的环境

            string serviceEXEPath = [email protected]"\MyFirstWindowsService.exe";//把服务的exe程序拷贝到了当前运行目录下,所以用此路径

            string serviceInstallCommand = string.Format(@"{0}  {1}", dotNetPath, serviceEXEPath);//安装服务时使用的dos命令

            string serviceUninstallCommand = string.Format(@"{0} -U {1}", dotNetPath, serviceEXEPath);//卸载服务时使用的dos命令

            try
            {
                if (File.Exists(dotNetPath))
                {
                    string[] cmd = new string[] { serviceUninstallCommand };

                    string ss = Cmd(cmd);

                    CloseProcess("cmd.exe");
                }

            }
            catch
            {
            }

            Thread.Sleep(1000);

            try
            {
                if (File.Exists(dotNetPath))
                {
                    string[] cmd = new string[] { serviceInstallCommand };

                    string ss = Cmd(cmd);

                    CloseProcess("cmd.exe");
                }

            }
            catch
            {

            }

            try
            {
                Thread.Sleep(3000);

                ServiceController sc = new ServiceController("MyFirstWindowsService");

                if (sc != null && (sc.Status.Equals(ServiceControllerStatus.Stopped)) ||

                          (sc.Status.Equals(ServiceControllerStatus.StopPending)))
                {
                    sc.Start();
                }
                sc.Refresh();
            }
            catch
            {
            }
        }

        /// <summary>
        /// 运行CMD命令
        /// </summary>
        /// <param name="cmd">命令</param>
        /// <returns></returns>
        public static string Cmd(string[] cmd)
        {
            Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.StandardInput.AutoFlush = true;
            for (int i = 0; i < cmd.Length; i++)
            {
                p.StandardInput.WriteLine(cmd[i].ToString());
            }
            p.StandardInput.WriteLine("exit");
            string strRst = p.StandardOutput.ReadToEnd();
            p.WaitForExit();
            p.Close();
            return strRst;
        }

        /// <summary>
        /// 关闭进程
        /// </summary>
        /// <param name="ProcName">进程名称</param>
        /// <returns></returns>
        public static bool CloseProcess(string ProcName)
        {
            bool result = false;
            System.Collections.ArrayList procList = new System.Collections.ArrayList();
            string tempName = "";
            int begpos;
            int endpos;
            foreach (System.Diagnostics.Process thisProc in System.Diagnostics.Process.GetProcesses())
            {
                tempName = thisProc.ToString();
                begpos = tempName.IndexOf("(") + 1;
                endpos = tempName.IndexOf(")");
                tempName = tempName.Substring(begpos, endpos - begpos);
                procList.Add(tempName);
                if (tempName == ProcName)
                {
                    if (!thisProc.CloseMainWindow())
                        thisProc.Kill(); // 当发送关闭窗口命令无效时强行结束进程
                    result = true;
                }
            }
            return result;
        }
    }

这段代码其实可以放在项目中的某个地方,或单独执行程序中,只好设置好dotNetPath和serviceEXEPath路径就可以了。

运行完后,如图, 再在安装目录下看记录的文件,

这样,一个windows服务安装成功了。

代码下载:http://download.csdn.net/detail/yysyangyangyangshan/6032671

时间: 2024-10-14 08:58:26

C#创建、安装一个Windows服务的相关文章

利用C#创建和安装一个windows服务

最近项目需要,需要定时获取天气资料往数据数库内写入数据,所以就考虑到了.net内的window服务.以前没有这方面的需求,所以基本没怎么接触过.所以也借这次机会好好补充下这方面的知识,以备以后工作之需. 关于winds服务的介绍,这里有一篇文章介绍得很清楚:http://blog.csdn.net/yysyangyangyangshan/article/details/7295739,但这里的具体步骤讲述不是很清楚,所以现用具体的方式再讲述下windows服务的开发与安装事项. 开发环境:Win

创建第一个windows服务

windows服务应用程序是一种长期运行在操作系统后台的程序,它对于服务器环境特别适合,它没有用户界面,不会产生任何可视输出,任何用户输出都回被写进windows事件日志. 计算机启动时,服务会自动开始运行,他们不要用户一定登陆才运行. 可以通过选择菜单"开始"-〉"控制面板"-〉"管理工具"-〉"服务"来查看现有系统中的服务,如下图: 创建一个windows服务 切换到代码视图修改. using System; using

给自己的C++程序创建为一个windows service

因为项目的一些变化和原因,需要把数据处理的一个后台程序创建为一个windows服务,运行以下命令能创建成功: sc create "MyApp Service Name" binPath= "D:/MathxH/Project/SocketService/trunk/MyApp/Win32/Release/MyApp.exe" start= auto 但是因为我的App程序是非服务(non-service)可执行程序,所以在让它运行的时候,却失败了,抛出以下错误:

为MongoDB创建一个Windows服务

一:选型,根据机器的操作系统类型来选择合适的版本,使用下面的命令行查询机器的操作系统版本 wmic os get osarchitecture 二:下载并安装 附上下载链接 点击安装包,我这里是把文件安装到了(E:\MongoDB) 安装好之后该文件夹下就出现下面的文件, 这个时候新建一个Data文件夹用来存放MongoDB的所有数据,新建一个Log文件夹用来存放日志文件 三:启动MongoDB数据库,在命令行窗口执行下面的命令,执行完成之后会看到下面的提示信息 e:\mongodb\bin\m

[翻译] 使用 .NET Core 3.0 创建一个 Windows 服务

原文: .NET Core Workers as Windows Services 在 .NET Core 3.0 中,我们引入了一种名为 Worker Service 的新型应用程序模板.此模板旨在为您在 .NET Core 中编写长时间运行的服务的提供一个起点.在本演练中,我们将创建一个 worker 并将其作为 Windows 服务运行. 创建一个 Worker 注意:在我们的预览版中,worker 模板与 Web 模板位于同一级菜单中.这将在未来的版本中发生变化.我们打算将 Worker

【先定一个小目标】Redis 安装成windows服务-开机自启

1.第一步安装成windows服务的,开机自启动 redis-server --service-install redis.windows.conf 2.启动\关闭 redis-server --service-start redis-server --service-stop 3.可安装多个实例 redis-server --service-install –service-name redisService1 –port 10001 redis-server --service-start

MongoDB 3.4 安装以 Windows 服务方式运行

1.首先从https://www.mongodb.com/download-center#community 下载社区版,企业版也是类似. 2.双击运行安装,可自定义安装路径,这里采用默认路径(C:\Program Files\MongoDB\Server\3.4) 一路下一步直至安装完毕. 3.创建数据存放目录(这里我放在D:\MongoDB\data). D:\MongoDB\data创建db目录和log目录,分别用来存放数据库文件和日志文件. 4.创建配置文件mongod.cfg存放在D:

将MongoDB安装为Windows服务---安装MongoDB服务

MongoDB是目前非常流行的一种NoSQL数据库,其灵活的存储方式备受开发人员青睐.本文就介绍一下如何安装并设置成Windows服务的方法.目前为止,我们每次启动MongoDB数据库服务都需要通过CMD输入指令mongod来开启服务,较为麻烦,所以本节介绍下如何将将mongo安装为Windows服务 配置完毕后的启动方式: Win+R 输入 services.msc找到Mongo_Service(这是上面 --serviceName 你填写的服务名称),然后属性,点击启动,然后就好了. 注意:

用 nssm 把 Nginx 安装成 Windows 服务方法

总之:用 nssm 比 srvany.exe 简便多了. 1. 下载nginx windows版本:http://nginx.org/ 2. 下载 nssm :http://nssm.cc/ 3. 安装Nginx下载解压到一个目录,nssm下载后解压相应版本(32/64)到一个目录.然后安装服务:nssm install N1 "D:\N1\nginx.exe" 即可安装成功最基本的服务,不过启动的是nssm,让后由nssm启动nginx. 现在就可以通过控制面板->管理员工具-