C#创建Windows服务的几个注意事项
1、服务安装后的自动启动:服务的StartType即使配置成Automatic,在首次安装成功之后还是要在服务列表中找到并手工启动。此外,可以通过在ProjectInstaller中添加AfterInstall事件,在这个事件中添加批处理启动此服务。这样在安装后就可以立马自动启动了。
2、服务的调试:如果服务执行异常,会导致服务启动失败,提示类似“…服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止”的语句。服务要启动后才能让VS在进程中附加,但是有时在服务启动的时候就出错,故没法附加进程调试出错的地方。现考虑一种方法,在服务中添加定时器 System.Timers.Timer,并在服务的启动方法中,启用定时器,然后把原先打算写在OnStart中的处理函数放入Timer的事件中,即可方便调试。
3 、在.net中常用log4net记录日志,通常在WinForm和WebForm中是配置指定log4net使用.config文件来读取配置信息时使用
[assembly: log4net.Config.DOMConfigurator(ConfigFile = "log4net.config", Watch = true)]。但是在windows服务中用这种方式则无法记录日志,因为此时IsDebugEnabled等属性都为false,故无法记录日志。究其原因,是因为在服务里不能正确定位到这个配置文件所致。如下代码中获取当前 exe 所在目录并用于得到config文件的路径:如下代码中获取当前 exe 所在目录并用于得到 config 文件的路径
static void Main()
{
string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
string configFilePath = assemblyDirPath + "\\log4net.config";
DOMConfigurator.ConfigureAndWatch(new FileInfo(configFilePath));
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new HtmlToExcelService()
};
ServiceBase.Run(ServicesToRun);
}
4、 要获取服务所在的目录,请使用AppDomain.CurrentDomain.BaseDirectory这个只读属性。如果需要生成服务的执行情况日志的,建议将日志文件放在服务所在的目录下。
5、windows服务中用到了 Excel 的 DCOM 组件, 服务的执行账户是 system。但是在执行中报出了一下错误:Exception from HRESULT: 0x800A03EC at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)。原因:如果服务是system用户, 系统会去寻找 system这个用户的Profile目录, 而这个用户是不能按照交互用户登录的,而且在处理excel文件的过程中, 一个 for SYSTEM 账户 "Desktop" 文件夹是必须的。故要创建一个这样的目录。在x64系统中,目录为: C:\Windows\SysWOW64\config\systemprofile\Desktop;在x86系统中,目录为: C:\Windows\System32\config\systemprofile\Desktop。
C#创建Windows服务的几个注意事项的更多相关文章
- 用C#创建Windows服务(Windows Services)
用C#创建Windows服务(Windows Services) 学习: 第一步:创建服务框架 创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(W ...
- 玩转Windows服务系列——创建Windows服务
创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...
- .Net创建windows服务入门
本文主要记录学习.net 如何创建windows服务. 1.创建一个Windows服务程序 2.新建安装程序 3.修改service文件 代码如下 protected override void On ...
- C# 创建Windows服务
创建windows服务项目 2 右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3 代码中OnStart用于执行服务事件,一般采用线程方式执行方法,便于隔一段事件执行一回 END ...
- 使用Topshelf创建Windows服务
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
- [转]C#创建Windows服务与安装
本文档用于创建windows服务说明,使用vs2010系统平台 创建项目 1 创建windows服务项目 2 右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3 代码中OnStart ...
- [Solution] Microsoft Windows 服务(2) 使用Topshelf创建Windows服务
除了通过.net提供的windows服务模板外,Topshelf是创建Windows服务的另一种方法. 官网教程:http://docs.topshelf-project.com/en/latest/ ...
- 在64位windows下使用instsrv.exe和srvany.exe创建windows服务
在64位windows下使用instsrv.exe和srvany.exe创建windows服务 在32位的windows下,包括windows7,windows xp以及windows 2003, ...
- 使用Topshelf 5步创建Windows 服务 z
使用Topshelf创建Windows 服务简要的介绍了创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with T ...
随机推荐
- MVC 4.0项目部署在IIS上无法浏览的解决方案
本文属于原创,转载请标明出处! MVC 4.0发布后部署到IIS上可能出现无法浏览的问题,浏览器报403的错误. 解决方法是:只需在web.config配置文件里的<system.webServ ...
- js拖动层
模仿网易彩票网(http://caipiao.163.com/)的登陆框自己做了一个拖动层,不过有点小问题——在谷歌浏览拖动的时候鼠标状态变成了文字状态(cursor:text;) <!DOCT ...
- jquery1.9学习笔记 之选择器(基本元素三)
标签选择器("element") 描述: 选择所有与给出标签名相匹配的元素. 同功能的JS原生方法:getElementByTagName() 例子: 查找每个div元素. &l ...
- Python之简单工厂模式实现
最近又看了下大话设计模式,决定用Python来试着实现下. 基础类 class OperationBase(): """ 基础运算类 """ ...
- PYTHON线程知识再研习A
前段时间看完LINUX的线程,同步,信息号之类的知识之后,再在理解PYTHON线程感觉又不一样了. 作一些测试吧. thread:模块提供了基本的线程和锁的支持 threading:提供了更高级别,功 ...
- FJ省队集训DAY4 T2
XXX #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #i ...
- 用keil怎么像makefile那样选择哪些文件进行编译?
因为设备有多种不同的型号的硬件,所以就有不同的驱动,我想在编译的时候,像在linux下的makeile那样,自己写一个编译连接的东西,来控制我哪些文件进行编译链接,不知道在keil下有没有这样的方法. ...
- codility上的问题 (19)Sigma 2012
题目: 像最大直方图一样给定一个数组是每个单位长度上的高度,求至少几个矩形可以拼出这个形状. 例如:给出的数组 H[0] = 8 H[1] = 8 H[2] = 5 H[3] = 7 H[4] = 9 ...
- 如何查找到文件以后,带目录一起拷贝到新的目录? cp --parents source destination
如何查找到文件以后,带目录一起拷贝到新的目录? cp --parents source destination
- 面试题32.从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从 1到12这些整数中包含1的数字中1,10,11和12,1一共出现了5次 本题可以直接变量1到n的n个数然后分别计 ...