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 ...
随机推荐
- mysql 5.6 参数详解
系统变量提供的是各种与服务器配置和功能有关的信息.大部分的系统变量都可以在服务器启动时进行设置.在运行时,每一个系统变量都拥有一个全局值或会话值,或者同时拥有这两个值.许多系统变量都是动态的,也就是说 ...
- NodeJs简单七行爬虫--爬取自己Qzone的说说并存入数据库
没有那么难的,嘿嘿,说起来呢其实挺简单的,或者不能叫爬虫,只需要将自己的数据加载到程序里再进行解析就可以了,如果说你的Qzone是向所有人开放的,那么就有一个JSONP的接口,这么说来就简单了,也就不 ...
- Ajax实现三级联动(0520)
查询数据库中的chinastates表,通过父级代号查询相应省市区. 实现界面: 在js页面实现三级联动 在JQuery中调用Ajax方法(引用JQuery文件一定放在最上面) 用插件的形式,创建三个 ...
- 仿校内textarea输入框字数限制效果
这是一个仿校内textarea回复消息输入框限制字数的效果,具体表现如下: 普通状态是一个输入框,当光标获取焦点时,出现字数记录和回复按钮 PS:上边那个小三角可不是用的图片. 普通状态效果如下: 获 ...
- linux下安装eclipse
最开始的版本OpenSuse + jre-7u25-linux-i586.tar.gz + eclipse-cpp-kepler-R-linux-gtk.tar.gz 配置好java环境后启动ecli ...
- JavaWeb学习笔记--4.EL表达式
四. 表达式语言(相当于对JSP中对象输出的简化,功能实质上类似) 转自ZHSJUN的博客 http://blog.csdn.net/zhsjun/article/details/2254546 表达 ...
- CentOS下安装JDK6u21和设置环境变量bin文件
1.先通过SSH登录到Linux系统中,通过SSH文件管理工具把Linux的JDK安装包上传到/home/acm/JavaTools/JDK目录: 2.进入/home/acm/JavaTools/JD ...
- 郁闷~win7无法进行局域网访问解决
win7无法进行局域网访问解决 公司里经常会使用网络共享的文件服务器,但是用win7的那伙计,在输入帐号和密码后却提示密码错误,试验了多次都是如此. 经过网上搜索文章及自己的研究最后发现这是由于win ...
- Activiti 使用自己的身份认证服务
Activiti 中内置了用户和组管理的服务,由identityService 提供调用接口,默认在spring配置中如下: <bean id="identityService&quo ...
- 动态Linq(结合反射)
这篇文章决定对最近一个单机版Web程序用到的东西总结一下. 一.反射Linq之OrderBy 动态Linq结合反射对某字段排序: namespace 动态Linq { class Program { ...