`
he91_com
  • 浏览: 401080 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
关于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服务

进入程序如图

空白服务如下
 public partial class Service1 : ServiceBase
    {
        System.Threading.Timer recordTimer;


        public Service1()
        {
            InitializeComponent();
        }


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


        protected override void OnStop()
        {
        }
    }
只要在OnStart里完成你的功能代码即可。本例中我们做一个定时向本地文件写记录的功能。
如图

创建一个类,用户写文件,
 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中调用,
 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文件拷贝至安装程序的运行目录下。

安装代码,

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 = Application.StartupPath+@"\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

分享到:
评论

相关推荐

    C# VS 2010 创建、安装、调试 windows服务(windows service)

    3. 这会生成一个安装项目,包括`setup.exe`和`installutil.exe`。`installutil.exe`是用于安装服务的命令行工具。 4. 打开命令提示符,使用管理员权限运行,然后输入`installutil.exe [服务可执行文件路径]`,例如`...

    C#创建Windows服务

    总结来说,使用C#创建Windows服务涉及以下几个关键步骤: 1. 引用`System.ServiceProcess`命名空间。 2. 创建一个继承自`ServiceBase`的类,重写`OnStart`和`OnStop`方法。 3. 实现安装程序类,使用`...

    C#创建Windows服务简单实例

    在项目中,你可以创建两个附加的批处理文件,一个用于安装服务(使用`installutil.exe ServiceName.exe`),另一个用于卸载(`installutil.exe /u ServiceName.exe`)。 2. **服务启动和停止逻辑**: 在`OnStart`...

    C#创建Windows服务(Windows Services) 实战之系统定时重启服务-程序开发

    本项目旨在利用 C# 编程语言创建一个 Windows 服务,该服务能够实现系统的定时重启功能。通过设置特定的时间间隔,该服务能够在无人干预的情况下自动重启计算机,这对于维护服务器稳定性、确保系统更新后的重启任务...

    C#创建windows服务+Form+Web调用服务

    综上所述,这个项目涵盖了从开发到部署的多个环节,包括使用C#创建Windows服务,通过Form与服务交互,以及设计一个Web接口让外部应用能够调用该服务。通过这样的实践,开发者可以深入理解如何在.NET环境中构建分布式...

    C#实现Windows服务创建、安装

    总结,C#创建Windows服务涉及继承`ServiceBase`,实现关键方法,并通过`installutil.exe`或`AssemblyInstaller`进行安装。这个过程涉及到进程管理、权限控制等多个方面的知识,对理解和掌握.NET框架有重要作用。通过...

    C# 创建windows服务源码

    总结,C#创建Windows服务涉及多个步骤,包括定义服务类、编写安装程序、安装服务和管理服务状态。通过理解这些概念和使用相应的.NET Framework类,开发者能够轻松地创建和维护Windows服务,满足各种后台任务的需求。...

    使用C#创建Windows服务 并发布Windows 服务.docx

    ### 使用C#创建Windows服务及发布Windows服务 #### 一、开发环境配置 为了确保能够顺利地进行Windows服务的开发与部署,首先需要准备好合适的开发环境。本案例中所使用的开发环境包括: - **操作系统**:Windows ...

    C#创建Windows Service(Windows 服务)demo

    **一、C#创建Windows Service** 首先,我们需要创建一个新的C#项目,并选择“安装”类库模板,这将为我们生成一个基础的Windows Service结构。关键的类是`ServiceBase`,它是所有Windows服务的基类。你需要继承这个...

    C#创建windows服务搭配定时器Timer使用实例(用代码做,截图版)

    总的来说,C#创建Windows服务并结合Timer进行定时任务是一个常见的需求,尤其在需要后台自动化执行任务的场景下。通过本文介绍的知识点,开发者可以掌握如何创建服务,启动和停止服务,以及如何利用Timer进行定时...

    使用C#创建Windows服务

    总结来说,使用C#创建Windows服务涉及到创建服务项目,编写服务逻辑,配置服务安装器,管理和调试服务,以及处理服务的生命周期和事件。这是一个涉及多方面技能的过程,但借助C#和.NET框架的强大功能,可以高效地...

    C#创建Windows系统服务及实例工程

    通过掌握C#创建Windows服务的方法,开发者可以构建更健壮、自动化程度更高的后台解决方案。 总的来说,C#为创建Windows服务提供了一套强大的工具和API。通过深入学习和实践,你可以更好地理解和利用这一特性,提升...

    C#创建windows服务/写wvebServer 接口

    本文将深入探讨如何使用C#来创建Windows服务,并构建一个Web服务器接口。这些技术对于系统集成、后台处理以及网络通信至关重要。 首先,让我们了解Windows服务。Windows服务是在操作系统后台运行的独立程序,它们不...

    用C#实现安装卸载windows服务程序

    安装服务需要一个安装程序类,该类通常包含两个安装器:一个用于服务进程(`ServiceProcessInstaller`),另一个用于服务本身(`ServiceInstaller`)。安装器设置服务的属性,如显示名称、启动类型等。安装服务可以...

    C# 创建及发布Windows 定时服务

    总的来说,C#创建Windows定时服务是一项常见的任务,它允许开发人员构建能够在系统后台自动运行的程序,定期执行特定任务,如数据备份、日志清理或监控等。通过理解上述概念和步骤,开发者能够有效地利用C#这一强大...

    c#创建服务(c#创建服务)

    4. **安装服务**:安装服务之前,需要创建一个安装程序类,该类继承自`System.Configuration.Install.Installer`。这个安装程序类将用于安装和卸载服务。 ```csharp [RunInstaller(true)] public partial class ...

    将C#生成的exe添加到windows服务器的服务

    一、创建Windows服务项目 在 Visual Studio 中创建一个新的 Windows 服务项目,例如 WindowsService1。创建成功后,我们可以在项目中看到一个 Service1 项。 二、添加安装程序 右键点击 Service1 项,然后选择...

    C#创建Windows服务(代码+说明文档)

    提供的压缩包“C#创建Windows服务(代码+说明文档)”应该包含了更详细的步骤和实例代码,可以帮助你更好地理解和实践这个过程。通过深入学习和实践,你可以轻松地为自己的系统构建定制化的Windows服务。

    c#安装windows服务需要注意的

    Windows服务提供了一个平台,使得程序可以在没有用户交互的情况下启动、运行和停止。以下是在C#中安装和使用Windows服务时需要注意的关键点: 1. **Timer组件选择**: 当涉及到Windows服务中的定时任务时,不能...

    C# 部署Windows 服务

    `InstallUtil.exe`工具用于安装服务,而安装过程中需要一个`Installer`类,它包含对服务和事件日志的配置。 3. **服务控制** `ServiceController`类用于与已安装的服务进行交互,如启动、停止、暂停或恢复服务。在...

Global site tag (gtag.js) - Google Analytics