posts - 244,  comments - 528,  trackbacks - 6

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

Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称。用Visual C# 创建Windows服务不是一件困难的事,本文就将指导你一步一步创建一个Windows服务并使用它。这个服务在启动和停止时,向一个文本文件中写入一些文字信息。

 第一步:创建服务框架
要创建一个新的 Windows 服务,可以从Visual C# 工程中选取 Windows 服务(Windows Service)选项,给工程一个新文件名,然后点击 确定。

你可以看到,向导向工程文件中增加WebService1.cs类:

其中各属性的含意是:

ü         Autolog                 是否自动写入系统的日志文件

ü         CanHandlePowerEvent     服务时候接受电源事件

ü         CanPauseAndContinue          服务是否接受暂停或继续运行的请求

ü         CanShutdown 服务是否在运行它的计算机关闭时收到通知,以便能够调用 OnShutDown 过程

ü         CanStop                              服务是否接受停止运行的请求

ü         ServiceName                       服务名

 

第二步:向服务中增加功能
在 .cs代码文件中我们可以看到,有两个被忽略的函数 OnStart和OnStop。

OnStart函数在启动服务时执行,OnStop函数在停止服务时执行。在这里,当启动和停止服务时,向一个文本文件中写入一些文字信息,代码如下:

protected override void OnStart(string[] args)

{

 FileStream fs = new FileStream(@"d:\mcWindowsService.txt" , FileMode.OpenOrCreate, FileAccess.Write);

StreamWriter m_streamWriter = new StreamWriter(fs);

m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);

m_streamWriter.WriteLine("mcWindowsService:         Service Started"+DateTime.Now.ToString()+"\n");

m_streamWriter.Flush();

m_streamWriter.Close();

fs.Close();

 

}

 

protected override void OnStop()

{

FileStream fs = new FileStream(@"d:\mcWindowsService.txt" , FileMode.OpenOrCreate, FileAccess.Write);

StreamWriter m_streamWriter = new StreamWriter(fs);

m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);

m_streamWriter.WriteLine(" mcWindowsService: Service Stopped "+DateTime.Now.ToString()+"\n");

m_streamWriter.Flush();

m_streamWriter.Close();

fs.Close();

}

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

 Visual Studio.NET 随附有安装组件,可用来安装与服务应用程序相关联的资源。安装组件在正在安装到的系统上注册一项单个的服务,并使服务控制管理器知道该服务的存在。

要正确安装服务,并不需要在安装程序中进行任何特殊编码。但是,如果需要向安装进程添加特殊功能,则可能偶尔需要修改安装程序的内容。

       将安装程序添加到服务应用程序的步骤是:

1:在解决方案中,访问要向其中添加安装组件的服务的Design视图。

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

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

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

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

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

ü         Disabled     服务无法启动。

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

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

 

第四步:生成服务程序

通过从生成菜单中选择生成来生成项目。

注意   不要通过按 F5 键来运行项目——不能以这种方式运行服务项目。

第五步:安装服务

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

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

installutil /u yourproject.exe

posted on 2005-02-25 10:56 cacard 阅读(18084) 评论(20)  编辑 收藏 网摘 所属分类: C#&.netFramework

FeedBack:
2005-03-09 14:08 | 西煞魄工人[未注册用户]
如果注册一个带参数的服务呢??

installutil.exe "service.exe -all -b -c"
??? 这样是肯定不行的。

  回复  引用    
#2楼[楼主]
2005-03-09 23:28 | caca(卡卡)      
你可以在程序的Main()函数设置参数,来接收这些参数,例如:
static void Main(string[] args)
{
foreach(string arg in args)
{
//处理参数
}
}

  回复  引用  查看    
2005-03-10 18:12 | 知道得越多知道的越少      
如果服务程序用来启动一个有窗体的程序
请问自动怎么解决无法显示界面的问题,因为它是以LocalService等非当前用户启动的,无法显示进程界面.

  回复  引用  查看    
2005-04-24 17:23 | 光影传说
真的想知道,可不可以象一般组件一样用Windows service,从里面调用方法,返回数据呢?
  回复  引用    
2006-02-24 14:03 | 寻找钱的足迹      
安装过程中,会弹出提示输入username和password还有确认密码等,这是怎么回事啊?
  回复  引用  查看    
2006-03-27 11:10 | 仰天一笑      
打包形式发布,不基于.net环境如何操作?
  回复  引用  查看    
2006-05-17 12:13 | lein[未注册用户]
1:在解决方案中,访问要向其中添加安装组件的服务的Design视图。

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

没有“添加安装程序链接”,我的vs.net2005。

  回复  引用    
2006-06-29 13:35 | eglic[未注册用户]
@寻找钱的足迹

创建安装程序后,在ProjectInstaller.cs上找到
serviceProcessInstaller1,他的属性窗格上修改 Account为LocalSystem


  回复  引用    
2006-07-05 17:16 | heaton527[未注册用户]
我想把一个循环监听某一个固定端口听程序,写成一个windows服务,该怎么写
是不是直接写在OnStart()方法里就行了?

  回复  引用    
2006-09-29 15:49 | space[未注册用户]
@知道得越多知道的越少

我也遇到同样的问题,不知道怎么解决,郁闷了好久。望有高人指点.

  回复  引用    
2006-10-08 16:33 | 鹏万里程[未注册用户]
我用的是VS2005
在安装的时候出现:
”System.ComponentModel.Win32Exception: 帐户名无效或不存在,或者密码对于指定的帐户名无效“
这是怎么回事

  回复  引用    
2007-04-28 16:56 | 合乎[未注册用户]
System.ServiceProcess.ServiceProcessInstaller类的三个属性:Account,Username,Password设置一下就可以了,在安装类里
  回复  引用    
2007-06-08 20:24 | 你好[未注册用户]
多谢提供。
  回复  引用    
2007-08-08 17:40 | fancyair[未注册用户]
为什么在windows服务中中无法访问远程数据库?
在普通的form窗体中没问题,连接字符串:Server=172.16.11.72;Database=aa;uid=sa;pwd=;
有没有什么办法解决

  回复  引用    
2007-10-18 09:59 | IDo'tKnown      
正在学习,感谢提供!
  回复  引用  查看    
2007-12-14 14:22 | 尘封的牛[未注册用户]
配置很麻烦 这有个c#下 window service 模版 赫赫
http://www.coding123.net/show.aspx?articleid=7
http://www.coding123.net/demo/Demo_WindowsService.zip

  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 109028 pI5h7r/Gk6Y=



相关文章:

相关链接:



NickName 卡卡 ^ cacard
MSN billgate(at)live.com
Email cacard(at)126.com


搜索

 

随笔分类

随笔档案

朋友

推荐网站

最新评论

  • 1. re: 情绪的作用
  • 总有一天这个系列的思想会停止,这个时候你长大了,或者说麻木了
  • --对月而歌
  • 2. re: 奇怪的IndexOutOfRangeException
  • 基本解决: !9C763BD9399B0328!2083.entry 另外,IndexOutOfRange只是在访问SqlServer时的表现,在访问Sybase数据库时可能会遭遇从驱动抛上来的错误“...
  • --lonegunman
  • 3. re: 奇怪的IndexOutOfRangeException
  • me too call me
  • --yuzhang233
  • 4. re: 情绪的作用
  • 卡卡同学 你现在都在想什么?
    怎么。。。
  • --baibai
  • 5. re: 理性与感性
  • 有个故事,说一位老头带着亮个儿子穿越一座山,突然遇到百年难遇的暴风雪,老透凭着多年的经验,说:“你们赶紧回去,我走的慢,会‘连累’你们。”可是他的儿子们一片孝心,谁的没离开老头,谁都没离开那场暴风雪,...
  • --NIHAIRUI

阅读排行榜

评论排行榜

This is footer