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。