flanker base @ cnblogs

defy all challenges & accelerate your life

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

上次翻译了一篇CodeProject上的关于用.Net创建Windows 服务的文章(后来发现原来有人早翻译过了)。今天做一个Windows服务的小程序,发现些小问题,记录下来。

关于Windows服务的安装

按照那篇文章的讲解,生成Windows服务后,可以使用Visual Studio的工具 InstallUtil.exe来注册服务。但是这个并不是很方便。所以可以使用Visual Studio的安装项目来创建一个安装程序。

添加一个安装项目,在解决方案资源管理器的Setup项目上右键选择添加-项目输出,这时弹出"添加项目输出组"对话框,在项目中选择你的服务,然后添加"主输出"即可。当然也可以添加其他你想要包含的内容。

接下来,在Setup项目上右键选择-视图-自定义操作,出现自定义操作界面,在自定义操作上右键选择添加自定义操作,出现"选择项目中的项"对话框,选择"应用程序文件夹"里的"主输出来自XXXX"即可。

Setup项目中的其他属性也可以修改,比如标题、名称、制造商等。还有一些其他设置这里不作讨论。 

这样生成项目后,在Setup项目上选择"生成",可以获得可执行的安装程序。用户用它安装即可,安装过程中会在注册表里添加必要信息来注册服务,可以在管理工具-服务中看到安装的服务,也可以卸载。

关于Windows服务的运行

我做的Windows服务小程序在测试过程中,发现运行时会有一些问题。假设服务程序安装到了C:\test\目录中,由于服务会读取一些配置文件并输出一些Log日志,结果出现错误,找不到配置文件,也没有在目录中生成Log日志。通过搜索发现,Log日志生成到了C:\Windows\System32目录中。

所以必须要让服务找到自己安装的目录,也就是服务的镜像目录。由于安装是用户自定义路径的,所以得通过其他方法。这里我通过查询注册表的方法,每个Windows服务都要在注册表里添加相关信息,包括服务名称、描述,还有镜像目录。所以先通过Microsoft.Win32.Registry类获得镜像目录,再以此目录来进行读取配置文件或者生成Log日志。

这样子可以解决这个问题。但是我不知道还有没有更好的方法。比如在程序中直接获得exe的绝对位置。以前WinForms程序可以通过System.Windows.Forms.Application类的StartupPath属性获得,但是在Windows服务中这个方法不行。

 

posted on 2008-01-06 00:53  flankerfc  阅读(372)  评论(0编辑  收藏  举报