原文地址:http://blog.itpub.net/23109131/viewspace-688117/

第一步:创建服务框架

创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(Windows Service)选项,给工程一个新文件名,然后点击确定。现在项目中有个Service1.cs类:

查看其各属性的含意是:

Autolog                          是否自动写入系统的日志文件
         CanHandlePowerEvent      服务时候接受电源事件
         CanPauseAndContinue     服务是否接受暂停或继续运行的请求
         CanShutdown                 服务是否在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程
         CanStop                        服务是否接受停止运行的请求
         ServiceName                  服务名

第二步:向服务中增加功能

在 .cs代码文件中我们可以看到,有两个被忽略的函数 OnStart和OnStop。

OnStart函数在启动服务时执行,OnStop函数在停止服务时执行。这个例子是:当启动和停止服务时,定时显示“hello,你好”;

首先在Service1.cs设计中拖个timer控件,设置好它的Interval=60000,与要做的功能

代码如下:

        //OnStart函数在启动服务时执行
protected override void OnStart(string[] args)
{
this.timer1.Start();
}
// OnStop函数在停止服务时执行
protected override void OnStop()
{
this.timer1.Stop();
} private void timer1_Tick(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://www.baidu.com");
}  

第三步: 将安装程序添加到服务应用程序

1:在解决方案中,右击服务Service1.cs设计视图。

2:在属性窗口中,单击-添加安装程序

这时项目中就添加了一个新类 ProjectInstaller 和两个安装组件 ServiceProcessInstaller 和 ServiceInstaller,并且服务的属性值被复制到组件。

3:若要确定如何启动服务,请单击 ServiceInstaller 组件并将 StartType 属性设置为适当的值。

Manual      服务安装后,必须手动启动。

Automatic    每次计算机重新启动时,服务都会自动启动。

Disabled     服务无法启动。

4:将serviceProcessInstaller类的Account属性改为 LocalSystem

这样,不论是以哪个用户登录的系统,服务总会启动。

第四步:生成服务程序

通过从生成菜单中选择生成来生成项目shift+F6。或重新生成项目注意   不要通过按 F5 键来运行项目——不能以这种方式运行服务项目。

第五步:服务的安装与卸载

访问项目中的已编译可执行文件所在的目录。 
用项目的输出作为参数,从命令行运行 InstallUtil.exe。在命令行中输入下列代码: 
installutil WindowsService1.exe

卸载服务 
用项目的输出作为参数,从命令行运行 InstallUtil.exe。

installutil /u WindowsService1.exe

附:installutil.exe 在安装VS电脑的C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe 
到vs2008命令提示符下installutil.exe /?可以查看其帮助说明

推荐的另一中安装服务的方法
 用winform来调用安装,当点击按钮时,安装服务.
1.项目需要添加引用System.Configuration.Install和System.ServiceProcess

代码如下:
using System.Configuration.Install;
using System.ServiceProcess;
/// <summary>   
   /// 安装服务   
   /// </summary>   
   private void btnInstall_Click(object sender, EventArgs e)   
   {   
         string[] args = { "WindowsService1.exe" };
           //卸载服务 string[] args = {"/u", "WindowsService1.exe"};  
            if (!ServiceIsExisted("Service1"))//这里的Service1是对应真实项目中的服务名称
            {
                try
                {
                    ManagedInstallerClass.InstallHelper(args);  //参数 args 就是你用 InstallUtil.exe 工具安装时的

参数。一般就是一个exe的文件名 
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }
            }
            else
            {
                MessageBox.Show("该服务已经存在,不用重复安装。");
            }
   }

/// <summary>   
/// 检查指定的服务是否存在。   
/// </summary>   
/// <param name="serviceName">要查找的服务名字</param>   
/// <returns></returns>   
private bool ServiceIsExisted(string svcName)   
{   
    ServiceController[] services = ServiceController.GetServices();   
    foreach (ServiceController s in services)   
    {   
        if (s.ServiceName == svcName)   
        {   
            return true;   
        }   
    }   
    return false;   
}

通过System.Configuration.Install.ManagedInstallerClass 类中的静态方法 InstallHelper就可以实现手工安装。 该方法的

签名如下: 
public static void InstallHelper(string[] args) 
其中参数 args 就是你用 InstallUtil.exe 工具安装时的参数。一般就是一个exe的文件名

第六步:调试服务

安装后,服务不会自动启动,服务不可以与桌面交互

1.设置服务安装后自动启动
添加serviceInstaller1的AfterInstall事件

using System.Diagnostics;
private void serviceInstaller1_AfterInstall(object sender, InstallEventArgs e)
{
System.ServiceProcess.ServiceController s = new System.ServiceProcess.ServiceController("Service1");
s.Start();//设置服务安装后立即启动
}

2.设置允许服务与桌面交互方法

让服务启动某个应用程序,就要修改服务的属性,勾选允许服务与桌面交互,#region 设置服务与桌面交互

/// <summary>
/// 设置服务与桌面交互,在serviceInstaller1的AfterInstall事件中使用
/// </summary>
/// <param name="serviceName">服务名称</param>
private void SetServiceDesktopInsteract(string serviceName)
{
System.Management.ManagementObject wmiService = new System.Management.ManagementObject(string.Format
("Win32_Service.Name='{0}'", serviceName));
System.Management.ManagementBaseObject changeMethod = wmiService.GetMethodParameters("Change");
changeMethod["DesktopInteract"] = true;
System.Management.ManagementBaseObject utParam = wmiService.InvokeMethod("Change", changeMethod,null
);
}
#endregion 

3.windows服务是不执行Timer控件的,解决办法
把上面用到的Timer控件清除
public Service1()
        {
            InitializeComponent();

System.Timers.Timer t = new System.Timers.Timer();
            t.Interval =1000*15;
            t.Elapsed += new System.Timers.ElapsedEventHandler(RunWork);
            t.AutoReset = true;//设置是执行一次(false),还是一直执行(true);
            t.Enabled = true;//是否执行

}

public void RunWork(object source, System.Timers.ElapsedEventArgs e)
        { 
           //要定时处理的事情
          //这样服务就可以定时执行任务了
        }

总结:windows服务编程
1.服务不会执行Timer控件
2.默认服务安装完成后,是不会自动启动,不能与桌面交互
3.安装服务时,推荐新建个winform项目,用winform项目来执行服务的安装与卸载
4.OnStart函数在启动服务时执行,OnStop函数在停止服务时执行。
5.右击-将服务添加到应用程序

(转)C#创建windows服务的更多相关文章

  1. 用C#创建Windows服务(Windows Services)

    用C#创建Windows服务(Windows Services) 学习:  第一步:创建服务框架 创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(W ...

  2. 玩转Windows服务系列——创建Windows服务

    创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...

  3. .Net创建windows服务入门

    本文主要记录学习.net 如何创建windows服务. 1.创建一个Windows服务程序 2.新建安装程序 3.修改service文件 代码如下 protected override void On ...

  4. C# 创建Windows服务

    创建windows服务项目   2 右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3 代码中OnStart用于执行服务事件,一般采用线程方式执行方法,便于隔一段事件执行一回 END ...

  5. 使用Topshelf创建Windows服务

    概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...

  6. [转]C#创建Windows服务与安装

    本文档用于创建windows服务说明,使用vs2010系统平台 创建项目 1 创建windows服务项目 2 右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3 代码中OnStart ...

  7. [Solution] Microsoft Windows 服务(2) 使用Topshelf创建Windows服务

    除了通过.net提供的windows服务模板外,Topshelf是创建Windows服务的另一种方法. 官网教程:http://docs.topshelf-project.com/en/latest/ ...

  8. 在64位windows下使用instsrv.exe和srvany.exe创建windows服务

    在64位windows下使用instsrv.exe和srvany.exe创建windows服务   在32位的windows下,包括windows7,windows xp以及windows 2003, ...

  9. 使用Topshelf 5步创建Windows 服务 z

    使用Topshelf创建Windows 服务简要的介绍了创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with T ...

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

       功能说明:C#创建一个windows服务,服务启动时D:\mcWindowsService.txt写入数据,服务运行期间每隔两秒写入当前时间. 原理这些就不说了,三语两语说不清楚,直接贴一个实例 ...

随机推荐

  1. 2016"百度之星" - 复赛(Astar Round3) 1003 拍照

    拍照 思路:先静态,离线树状数组,分别统计每个点向左向右能看到的船的数量.再枚举整个区间求最大值. 应为人和船都是动态的,假设船往左走,处理每个点看到向左最大船的数量,满足动态条件.就是向左的船一开始 ...

  2. STL --最常见的容器使用要点

    如果只是要找到STL某个容器的用法, 可以参考msdn和C++ Library Reference,msdn 上面的知识点应该是最新的,C++ Library Reference虽古老但是很多经典的容 ...

  3. Node.js中的ORM

    ORM2是一款基于Node.js实现的ORM框架,名字相当的霸气,算是同类框架中非常出色的一款,具体介绍请猛击:https://github.com/dresende/node-orm2 刚接触Nod ...

  4. HDU-4614 Vases and Flowers 线段树区间更新

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4614 线段树保存区间是否被覆盖以及区间的和即可,在询问的时候在线段树上二分查找就可以了...代码写得比 ...

  5. SQLServer 2000个人版下载

    http://wt.duote.com/soft/11458.html                      sql server 2000个人版下载

  6. python 使用dict和set

    dict Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度. 举个例子,假设要根据同学的名字 ...

  7. 转载ASP.net 中 OutputCache 指令各个参数的作用

    使用@ OutputCache指令 使用@ OutputCache指令,能够实现对页面输出缓存的一般性需要.@ OutputCache指令在ASP.NET页或者页中包含的用户控件的头部声明.这种方式非 ...

  8. ASP.NET奇葩说

    1.form表单 在asp.net中(即runat="server"特性时)method默认值为post  在html中默认是get. 2.Web应用程序项目和网站项目:前者后台文 ...

  9. 5-17 Hashing (25分)

    The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...

  10. Java输出考试前三名

    实现输出考试成绩的前三名 要求: 1. 考试成绩已保存在数组 scores 中,数组元素依次为 89 , -23 , 64 , 91 , 119 , 52 , 73 2. 要求通过自定义方法来实现成绩 ...