VS 2010一步步开发windows服务(windows service)

 基于0起步来创建一个服务,做到简单的记录时间日志功能,其具体招行方法可自行添加。

1.创建服务

2.删除默认服务文件

3.添加自己的服务文件

4.更改启动项目

5. 引用 using System.Timers;并添加FileClass类

FileClass类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace TerminalTrance
{
    public class FileClass
    {
        //创建文件夹
        //参数:path 文件夹路径
        public bool CreateFolder(string path)
        {
            try
            {
                if (Directory.Exists(path))
                {
                    return true;
                }
                if (!Directory.Exists(path.Substring(0, path.LastIndexOf("\\"))))
                { //若路径中无“\”则表示路径错误
                    return false;
                }
                else
                {
                    //创建文件夹
                    DirectoryInfo dirInfo = Directory.CreateDirectory(path);
                    return true;
                }
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        //创建文件
        //参数:path 文件路径
        public void CreateFile(string path)
        {
            try
            {
                if (CreateFolder(path.Substring(0, path.LastIndexOf("\\"))))
                {
                    if (!File.Exists(path))
                    {
                        FileStream fs = File.Create(path);
                        fs.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                return;
            }

        }

        //删除文件
        //参数:path 文件夹路径
        public void DeleteFile(string path)
        {
            try
            {
                if (!File.Exists(path))
                {
                    return;
                }
                else
                {
                    File.Delete(path);
                }

            }
            catch (Exception ex)
            {
                return;
            }
        }

        //写文件
        //参数:path 文件夹路径 、content要写的内容
        public void WriteFile(string path, string content)
        {
            try
            {
                if (!File.Exists(path))
                {
                    CreateFile(path);
                }
                FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);
                sw.WriteLine(content);
                sw.Close();
            }
            catch (Exception ex)
            {
                return;
            }
        }

        /// <summary>
        /// 将即时日志保存入日志文件
        /// </summary>
        public void WriteLogFile(string directoryPath, string content)
        {
            if (!Directory.Exists(directoryPath))
            {
                CreateFolder(directoryPath);
            }
            try
            {
                //写入新的文件
                string filePath = directoryPath + "\\" + DateTime.Now.Date.ToString("yyyyMMdd") + ".log";
                FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write);
                StreamWriter sw = new StreamWriter(fs);
                sw.WriteLine(content);
                sw.Close();
                fs.Close();
            }
            catch (Exception ex)
            {

            }

        }
    }

}

6. 添加上步中需要的InitService()方法

/// <summary>
        /// 初始化服务参数
        /// </summary>
        private void InitService()
        {
            base.CanShutdown = true;
            base.CanStop = true;
            base.CanPauseAndContinue = true;
            this.ServiceName = MainService.serviceName;
            this.AutoLog = false;//为了使用自定义日志,必须将 AutoLog 设置为 false

            tim = new System.Timers.Timer();
            tim.Elapsed += new ElapsedEventHandler(tim_Elapsed);
            tim.Interval = 5000;
            tim.AutoReset = true;
        }

7. 解决System不包含windows属性问题,引用程序集。

8.添加上面引用 的 tim_Elapsed 定时方法

 private void tim_Elapsed(object sender, EventArgs e)
        {
            StartThread();
        }

        /// <summary>
        /// 开始任务
        /// </summary>
        private void StartThread()
        {
            MessageAdd(serviceName + " " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        }

        /// <summary>
        ///  日志记录
        /// </summary>
        /// <param name="serviceName">内容</param>
        public void MessageAdd(string str)
        {
            try
            {
                fileclass.WriteLogFile(logPath, str);//写入记录日志
            }
            catch
            {

            }
        }

9.此时生成解决方案是成功的

10.在OnStart等中写入自己的方法,这里用日志记录

   protected override void OnStart(string[] args)
        {
            try
            {
                this.tim.Enabled = true;
                this.tim.Start();
            }
            catch (Exception ex)
            {
                MessageAdd("OnStart错误:" + ex.Message);
            }
            MessageAdd(serviceName + "已成功启动!");
        }

        protected override void OnStop()
        {
            try
            {
                this.tim.Stop();
            }
            catch (Exception ex)
            {
                MessageAdd("OnStop错误:" + ex.Message);
            }
            MessageAdd(serviceName + "已停止!");
        }

        protected override void OnContinue()
        {
            this.tim.Start();
            base.OnContinue();
        }

        protected override void OnPause()
        {
            this.tim.Stop();
            base.OnPause();
        }

11.给服务添加安装程序。右键鼠标单击MainService.cs[设计]*选项卡选项“添加安装程序”。

12.可以看见项目中多了如下文件和组件,serviceProcessInstaller1、serviceInstaller1是自动生成的

13.设置组件serviceInstaller1的主要属性,StartType: AutoMatic自动启动;ServiceName: 服务系统标识,在cmd命令中执行sr start/stop/query等等命令时候使用,用来唯一标识一个Window服务

 

14.设置组件serviceProcessInstaller1的主要属性,Accout:账户类型,LocalSystem本地系统服务;

15.设置服务安装后“允许和桌面进行交互”,

需要在ProjectInstaller.cs中添加如下代码。

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;

namespace TerminalTrance
{
    [RunInstaller(true)]
    public partial class ProjectInstaller : System.Configuration.Install.Installer
    {
        public ProjectInstaller()
        {
            InitializeComponent();
        }

        protected override void OnAfterInstall(IDictionary savedState)
        {

            try
            {

                base.OnAfterInstall(savedState);

                // 允许服务桌面交互

                System.Management.ManagementObject myService = new System.Management.ManagementObject(string.Format("Win32_Service.Name='{0}'", this.serviceInstaller1.ServiceName));

                System.Management.ManagementBaseObject changeMethod = myService.GetMethodParameters("Change");

                changeMethod["DesktopInteract"] = true;

                System.Management.ManagementBaseObject OutParam = myService.InvokeMethod("Change", changeMethod, null);

            }

            catch (Exception ex)
            {

            }

        }
    }
}

16.Windows服务的安装和卸载

代码写完后,编译通过后,就可以安装、卸载、调试服务了。

在执行安装或卸载服务前,我有把服务需要的相关文件,复制到C:\Service\下面或其他路径。一旦安装完成后,此目录不能变更,否则不能卸载该服务和服务运行会报错。

安装、卸载很简单,只要在VS命令行导航到,服务程序的路径。然后运行以下命令就OK了。

打开如图:

安装服务:installutil C:\Service\TerminalTrance.exe

卸载服务:installutil /u C:\Service\TerminalTrance.exe

调试的话,只能先安装启动服务,然后将该服务附加到进程,就可以调试了。安装好服务后,就可以在win7服务管理里面,管理刚刚启动的服务了。

 安装成功后可在服务中看到

 在服务程序中可以看到添加的服务

可以看到程序的日志记录

另外一个方法是生成安装exe程序

1.解决方案右键=》新建项目=》选择安装程序

2.安装项目右键=》添加=》项目输出,选择主项目

3.安装项目右键=》视图=》自定义操作

4.自定义操作=》安装右键=》选择主输出

5.卸载右键=》选择主输出

6.若有文件需要添加到安装后的文件夹中=》点击应用程序文件夹=》添加=》文件,选择文件。安装后就会生成指定文件。

7.生成程序,完成,Setup文件夹中找到exe安装文件执行就 OK了。卸载也是执行此exe,按提示下一步就OK。

时间: 2024-11-09 00:37:42

VS 2010一步步开发windows服务(windows service)的相关文章

用.NET创建Windows服务

window|创建 我们将研究如何创建一个作为Windows服务的应用程序.内容包含什么是Windows服务如何创建.安装和调试它们.会用到System.ServiceProcess.ServiceBase命名空间的类.  什么是Windows服务 Windows服务应用程序是一种需要长期运行的应用程序它对于服务器环境特别适合.它没有用户界面并且也不会产生任何可视输出.任何用户消息都会被写进Windows事件日志.计算机启动时服务会自动开始运行.它们不要用户一定登录才运行它们能在包括这个系统内的

给windows服务添加描述

window   最近写了个Windows服务(Windows Services),安装了以后,觉得和已有的Windows服务不一样.为什么?我的缺少描述,中间一栏是空的. 再看.NET的ServiceBase类没有添加描述的属性. public class ProjectInstaller : System.Configuration.Install.Installer中也没有什么属性来添加.从网搜了后才知道要重载ProjectInstaller 的Install和UnInstall虚方法.其

如何创建Windows服务

创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Services.ServicesPS .其实主要是使用Services,VS2012下不清楚为什么生成了两个项目. 注册Windows服务 Windows服务第一次启动时,是需要注册的,注册方式可以通过命令行或批处理的方式. Services.exe -regserver 卸载Windows服务 既然服务需要注册,那

在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序

原文 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 在 Visual Studio 2010 中开发和部署 Windows Azure 应用程序 Jim Nakashima.Hani Atassi 和 Danny Thorpe 将应用程序或服务部署到 Microsoft 云服务平台 Windows Azure 的原因有很多.例如,只为使用的内容付费从而可降低操作和硬件成本.构建几乎能无限缩放的应用程序.巨大的存储容量.地理位置等等,不胜枚举. 只有

用C#开发Windows服务监控系统使用

window|监控 摘要 本文将向你展示如何用C#开发一个Windows服务来记录系统使用情况. 每一个人都想知道他们每天在什么时间启动和关闭自己的系统,以及系统每天运行了多少时间.如果用一个DataGrid控件来显示系统启动.关闭及所消耗的时间将是一个不错的主意. 在本文中,我提供了一种方法来实现这一目标-使用C#开发一个Windows服务.其实,每个人都了解一点Windows服务.但是,为了介绍之目的,我仅尽可能少得解释一下Windows服务.然后,我们来讨论如何设计一个这样的应用程序. 一

借助C++进行Windows开发:Windows服务增强

目录 延迟自动启动服务 改进关机可预见性 失败操作和受控停止 减少权限 保护服务数据 用受限令牌保护其他项目 接收服务通知 后续内容 Windows服务开发的状态自从在 Windows NT 中出现服务以来一直没有较大的改变,但是 Windows Vista 和 Windows Server 2008 打破了这一僵局.这其中的许多功能主要是为了以更简捷的方式生成更安全的服务,但是在与安全性不相关的服务功能中,有些功能是为了提高 Windows 的整体响应能力和可靠性. 延迟自动启动服务 可通过

C#开发的windows服务如何获取操作系统登录的消息

问题描述 windows服务一般是没有UI的因为需要一个监控,一组业务不停循环,所以使用windows服务开发监视器窗体在服务中确实通过P/Invoke的方式调用正常显示但发现只有当前用户登录才可以,因为重新启动后监视器窗体成功显示,但监视器对象提示为空(null),我估计是没有任何交互式用户登录希望能够在服务中监听系统登录事件哪位兄弟处理过类似问题或有好的解决办法请赐教 解决方案 解决方案二:mark一个解决方案三:up一下~~~~~解决方案四:up一下解决方案五:服务运行不需要UI支持的.一

开发的windows服务 启动时出现1053错误

问题描述 自己开发的windows服务,在自己电脑安装是成功的,能正常运行.放到阿里云服务器安装时也能成功,但是安装过程中出现异常,不过是跳过了异常,好像是因为启动不了导致异常.然后我打开服务找开自己的windows服务启动时就提示"服务错误1053:服务没有及时响应启动或控制请求"这是什么问题导致的,是权限还是代码. 解决方案 解决方案二:有人吗,急啊解决方案三:改成空的服务再安装也不行解决方案四:查了下日志提示等待Service1服务的连接超时(30000毫秒).这是什么问题导致

使用Topshelf 开发windows服务

在业务系统中,我们为了调度一些自动执行的任务或从队列中消费一些消息,所以基本上都会涉及到后台服务的开发.如果用windows service开发,非常不爽的一件事就是:调试相对麻烦,而且你还需要了解 windows service 相关的一些开发和安装部署,所以,windows service非常的不方便.Topshelf框架,能够让你将 console application 直接封装为 windows service,这样你在开发的时候,就可以直接在console 程序上开发,然后构成win