windows服务部署与卸载
同事问到windows service的东东,现在整理一下,用c#如何创建一个windows service,以及如何调试、部署、卸载。
一、创建windows service
1. 打开VS2008,新建一个Project, Project类型选择Visual C#-Windows,在Templates中选择Windows Service, 其他可以默认,点击OK。
2. 在Solution Explorer中会看到自动产生了三个文件:app.config, Program.cs,Service1.cs,其中app.config可以添加一些自定义的配置信息,供代码文件使用;Program.cs提供了Main()方法,作为程序的人口,一般不需要修改;Service1.cs就是要实现的服务。
3. 双击打开Service1.cs,会默认打开Service1.cs[Design],在这个界面可以拖拽一个组件,此外,在Properties中,会看到一些关于这个service的属性设置,比如AutoLog(True:使用windows event log记录该service的日志;False:用户可以自定义自己的event Log),CanPauseAndContinue(True:可以处理暂停和继续该服务的操作;False:不可以处理暂停或者继续该服务的操作),ServiceName(用于让Service Control Manager识别的服务名称)。
4. 转到Code视图,可以看到默认生成了一个构造函数,和两个需要重写的方法OnStart和OnStop,我们需要覆写这两个方法。下面是简单重写了OnStart方法。
protected override void OnStart(string[] args) { string path = @"d:\share\test.txt"; StreamWriter sw; sw = new StreamWriter(path); foreach (string arg in args) sw.WriteLine(arg); sw.Close(); sw.Dispose(); } 这样最基本的一个windows service就搞定了,但是能否正常运行,我们需要调试一把。
二、调试windows service
通常,我们用的调试方法是需要把服务部署好,然后attach to process...,找到对应的服务进程,予以调试。但是操作比较繁琐,修改完服务后,需要卸载服务,然后重新部署,并且OnStart方法难以调试。从网络上找到一个好的调试方法,并尝试通过,很好用的,推荐给大家:)
1. 在Service1.cs中添加public方法,将需要调试的protected方法进行封装,供Main()调用,以调试OnStart()为例:
public void start(string[] args) { this.OnStart(args); }
2. 在Main()中添加下面的代码,在人机交互时执行:
if (Environment.UserInteractive) { Service1 s = new Service1(); string[] args = { "a", "b" }; s.start(args); Console.WriteLine("the service is started"); Console.ReadLine(); s.stop(); Console.WriteLine("the service is stopped"); } else { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new Service1() }; ServiceBase.Run(ServicesToRun); }
3. 更改Project的输出类型
右击该Project,点击Properties,在Application标签中,更改Output Type为Console Application。
好了,这样就可以按F5调试了:)
三、部署
1. 在Service1.cs的design视图中,右击鼠标,点击Add Installer,会自动创建一个ProjectInstall.cs文件,在design视图中,有两个组件serviceProcessInstaller1:这个组件的属性有一个叫Accout,默认是User,这样在部署的时候需要输入用户名和密码,这里我们可以选择权限最小的Localservice,当然要获得更多的权限可以设置其它两个network service和local
serviceInstaller1:与服务本身相关的信息,比如服务名,服务描述,显示名称,启动类型等。
2. 如果使用系统默认的event log,那么现在就可以编译然后部署了;如果使用了自定义的event log,则需要在ProjectInstaller中修改部分代码。
3. 使用installutil.exe部署windows service
(注意权限,这里需要用Administrator用户去部署,否则会提示一些错误信息:比如An exception occurred during the Install phase. System.Security.SecurityException: The source was not found, but some or all eve nt logs could not be searched. Inaccessible logs: Security. 或者 access is denied)
runas /user:Administrator cmd
cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
installutil D:\project\WindowsService1\WindowsService1\bin\Debug\windowsservice1.exe
到此就部署完成了。
四、卸载服务
installutil /uD:\project\WindowsService1\WindowsService1\bin\Debug\windowsservice1.exe
五、启动服务
1. 在启动服务时,有时候会出现服务启动后又停止的错误提示信息,指出该服务可能没有被使用,我们可以查看eventvwr,里面会给出足够的错误信息,根据错误信息调整service代码就可以了,也有可能是因为服务要操作文件,没有权限的原因,这时候把要操作的文件权限放开就可以了。
2. 启动服务的时候,由于权限问题启动失败,我们可以设置启动的账号。
3. windows service的参数是在启动时一次传递的,可以以界面形式传入参数,也可以通过命令行的形式:sc start service1 arg0 arg1 ...
windows服务部署与卸载的更多相关文章
- Windows服务安装与卸载
Windows服务安装与卸载,使用到了InstallUtil.exe 安装: c: cd "C:\Windows\Microsoft.NET\Framework\v4.0.30319&quo ...
- C# windows服务安装及卸载
--C# windows服务安装及卸载 保存BAT文件 执行即可 @SET FrameworkDir=%WINDIR%\Microsoft.NET\Framework@SET Framework ...
- Windows服务的安装卸载及错误查找
@echo off echo 清理原有服务项. . . %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil /U D:\abc\te ...
- Windows服务安装、卸载、启动和关闭的管理器
最近在重构公司的系统,把一些需要独立执行.并不需要人为关注的组件转换为Windows服务,Windows服务在使用的过程中有很多好处,相信这一点,就不用我多说了.但是每次都要建立Windows服务项目 ...
- windows服务部署
1.新建windows服务项目 2.编辑业务代码 我这里只写2句记录文本的测试代码 using System; using System.IO; using System.ServiceProcess ...
- .NET Core Generic Host Windows服务部署使用Topshelf
此文源于前公司在迁移项目到.NET Core的过程中,希望使用Generic Host来管理定时任务程序时,没法部署到Windows服务的问题,而且官方也没给出解决方案,只能关注一下官方issue # ...
- windows 服务 安装、卸载
1.新建项目 选中windows服务 2.添加安装程序 3.修改安装代码 ServiceProcessInstaller processInstall; ServiceInstaller servic ...
- C# 使用TopShelf实现Windows服务部署
一.TopShelf介绍 topShelf是创建Windows服务的一种方式,可以方便管理应用服务,最大广泛应用于,数据实时接收,定时推送等. 二.TopShelf使用 1.安装 TopShelf程序 ...
- C# Windows服务创建安装卸载
一.创建Windows服务 使用VS创建一个新的windows服务应用程序 创建完成之后 二.相关配置 修改Service1名称为StartService(可以不改,自行选择) 添加安装程序并修改配置 ...
随机推荐
- 继承多态绕点 Java篇
上一篇把C#语言的继承,多态里的特殊的情况做了一下总结,其实那一部分代码都是从Java翻译过去的,今天来总结一下Java在这种情况下是怎么调用的. 上一篇我们说的是:1.多态,只在多态系里方法调用,很 ...
- go局部变量的存储空间是堆还是栈?
编译器会自动选择在栈上还是在堆上分配局部变量的存储空间,但可能令人惊讶的是,这个选择并不是由用var还是new声明变量的方式决定的. var global *int func f() { var x ...
- Oracle “dba_tables”介绍
DBA_TABLES describes all relational tables in the database. Its columns are the same as those in ALL ...
- FZU 2027 单词问题 map标记字符串典型问题
题目链接:单词问题 找一个字符串里的所有单词,重复的只输出一次.关于map函数key值是字符串的问题一直比较含糊... 挣扎了一番,大概是,map的key值是char型数组的时候,标记的是地址,于是有 ...
- SqlServer2008快照隔离模式的业务应用
场景: 有200个检测点,每个检测点每天采集5个数据,对表的读写都是随机的(即有可能同时读写),总共有5年的数据. 存储方案A: 日期 点号 类型 值 20120101 001 A 1.0 20120 ...
- RewriteRule参数
RewriteCond指令格式 [说明]定义重写发生的条件 [语法]RewriteCond TestString CondPattern [flags] RewriteCond指令定义一条规则条件.在 ...
- tortoisegit教程
tortoisegit教程: http://www.mamicode.com/info-detail-311565.html https://my.oschina.net/longxuu/blog/1 ...
- eclipse debug时老提示edit source lookup path解决方案
用myeclipse debug web应用的时候,总提示edit source lookup path,每次都得手动选择项目,费时费力.在网上终于找到了方法. 搬运:http://www.educi ...
- js unix时间戳转换
一.unix时间戳转普通时间: var unixtime=1358932051; var unixTimestamp = new Date(unixtime* 1000); commonTime = ...
- Deep Learning In NLP 神经网络与词向量
0. 词向量是什么 自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化. NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representati ...