最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多。像后台运行不阻塞系统,不用用户登录之类。哈哈,扯远了,今天讲一下那个怎么给Windows服务做个安装包。为什么做安装包?当然是方便了,不用每次调用InstallUtil,还有,就是看上去正规些。
不多说了,先来看看怎么做吧。首先,当然是创建一个Windows服务的项目。这个大家应该都知道怎么做(这都不明白的留言问我),然后要给服务“添加安装程序”,如图1所示:(这一步和自己用InstallUtil注册是完全一样的)
(图1)
添加后,会出来一个serviceProcessInstal1,还有serviceInstaller1,如果你一个项目里有两个服务的话,这里就会有两个serviceInstaller类,如图2:
(图2)
图3是serviceProcessInstal1的属性页,其中Account就是指用于运行服务的帐户,如果只是用于本地,可以选LocalSystem(本地系统),这是本地的最高权限,并可以选择和桌面交互功能。如果安全性考虑的话,请选择适合自己的。
(图3)
图4是serviceInstaller2的属性页,其中DisplayName就是显示在Windows服务管理器中的服务名称,Desciption是服务的说明。下面ServiceName是服务内部名称。最关键的是下面的StartType,是指服务的启动方式,是自动,手动和禁用三种。
(图4)
下面,就是今天讲的重点了,点击“文件”->“添加”->“新建项目”(如图5)
(图5)
选择“其他项目类型”->“安装和部署”里的“安装项目”(如图6)
(图6)
建好项目后,右键刚才新建的安装项目,选择“视图”->“文件系统”(如图7)
(图7)
这时,打开了文件系统属性。可以看到,屏幕左边,出现了三项文件系统的内容,因为我们是Windows服务程序,不需要在开始菜单和桌面上放置图标,所以我们直接右键“应用程序文件夹”->“添加”->“项目输出”(如图8)
(图8)
在出来的对话框中,选择“主输出”和“Release XXX”,这个由你的项目属性决定,一般选择Release Any CPU。(如图9)
(图9)
系统会自动把项目输出文件,也就是Windows服务程序的EXE文件和所有引用的类库文件都列在中间的框中。这时,为了方便安装,我们把InstallUtil.exe和两个我自己写的批处理文件一起添加进去。添加方法类似上面,只是把“项目输出”改成“文件”。
结果如图10所示:
(图10)
接下来,就该配置一下安装过程,让安装程序自动给我们安装和卸载Windows服务。
还是右键安装项目,选“视图”->“自定义操作”,如图11:
(图11)
左边的窗口换到了自定义操作的视图了,右键“安装”->“添加自定义操作”(图12),出现的对话框中,选中“应用程序文件夹”,再选中其中的InstallUtil.exe文件(图13),添加好后,会在安装操作下面多出一个InstallUtil.exe的分支。点一下它,在右边的属性页里,设置Arguments=“ 你的Windows服务文件名”,如图14(注意文件名前要留一个空格)
(图12)
(图13)
(图14)
同样,在提交和卸载处,也添加InstallUtil.exe,不过属性页中设置Arguments=“ -u 你的Windows服务文件名”,这样,安装程序就能实现自动安装注册和卸载Windows服务了。(如图15)
(图15)
接下来就该让Windows服务和安装项目同时被编译了。右键点击解决方案,选择“属性”(如图16),在出来的对话框中,勾上安装项目后面的生成。(如图17)
(图16)
(图17)
最后,右键解决方案,选择“生成解决方案”,这时vs会将两个项目都会编译出来。不过要注意一点: 项目的启动顺序一定要Windows服务项目在前,安装项目在后。
不多说了,先来看看怎么做吧。首先,当然是创建一个Windows服务的项目。这个大家应该都知道怎么做(这都不明白的留言问我),然后要给服务“添加安装程序”,如图1所示:(这一步和自己用InstallUtil注册是完全一样的)
(图1)
添加后,会出来一个serviceProcessInstal1,还有serviceInstaller1,如果你一个项目里有两个服务的话,这里就会有两个serviceInstaller类,如图2:
(图2)
图3是serviceProcessInstal1的属性页,其中Account就是指用于运行服务的帐户,如果只是用于本地,可以选LocalSystem(本地系统),这是本地的最高权限,并可以选择和桌面交互功能。如果安全性考虑的话,请选择适合自己的。
(图3)
图4是serviceInstaller2的属性页,其中DisplayName就是显示在Windows服务管理器中的服务名称,Desciption是服务的说明。下面ServiceName是服务内部名称。最关键的是下面的StartType,是指服务的启动方式,是自动,手动和禁用三种。
(图4)
下面,就是今天讲的重点了,点击“文件”->“添加”->“新建项目”(如图5)
(图5)
选择“其他项目类型”->“安装和部署”里的“安装项目”(如图6)
(图6)
建好项目后,右键刚才新建的安装项目,选择“视图”->“文件系统”(如图7)
(图7)
这时,打开了文件系统属性。可以看到,屏幕左边,出现了三项文件系统的内容,因为我们是Windows服务程序,不需要在开始菜单和桌面上放置图标,所以我们直接右键“应用程序文件夹”->“添加”->“项目输出”(如图8)
(图8)
在出来的对话框中,选择“主输出”和“Release XXX”,这个由你的项目属性决定,一般选择Release Any CPU。(如图9)
(图9)
系统会自动把项目输出文件,也就是Windows服务程序的EXE文件和所有引用的类库文件都列在中间的框中。这时,为了方便安装,我们把InstallUtil.exe和两个我自己写的批处理文件一起添加进去。添加方法类似上面,只是把“项目输出”改成“文件”。
结果如图10所示:
(图10)
接下来,就该配置一下安装过程,让安装程序自动给我们安装和卸载Windows服务。
还是右键安装项目,选“视图”->“自定义操作”,如图11:
(图11)
左边的窗口换到了自定义操作的视图了,右键“安装”->“添加自定义操作”(图12),出现的对话框中,选中“应用程序文件夹”,再选中其中的InstallUtil.exe文件(图13),添加好后,会在安装操作下面多出一个InstallUtil.exe的分支。点一下它,在右边的属性页里,设置Arguments=“ 你的Windows服务文件名”,如图14(注意文件名前要留一个空格)
(图12)
(图13)
(图14)
同样,在提交和卸载处,也添加InstallUtil.exe,不过属性页中设置Arguments=“ -u 你的Windows服务文件名”,这样,安装程序就能实现自动安装注册和卸载Windows服务了。(如图15)
(图15)
接下来就该让Windows服务和安装项目同时被编译了。右键点击解决方案,选择“属性”(如图16),在出来的对话框中,勾上安装项目后面的生成。(如图17)
(图16)
(图17)
最后,右键解决方案,选择“生成解决方案”,这时vs会将两个项目都会编译出来。不过要注意一点: 项目的启动顺序一定要Windows服务项目在前,安装项目在后。
以下为微软网站信息(我照上面没有成功,后来发现在12步有问题),按下面成功!
创建 Windows 服务的安装项目
此部分介绍如何创建 Windows 服务项目,以及如何安装 Windows 服务中使用已编译的安装项目。
创建 Windows 服务项目
- 启动 Microsoft Visual Studio。
- 在 文件 菜单上指向 新建 ,然后单击 项目 。
- 单击 项目类型 下的 Visual C# 项目 ,然后单击 模板 下的 Windows 服务 。
请注意 在 Visual Studio 2005 或 Visual Studio 2008,展开 项目类型 下的 Visual C# 、 单击 Windows ,然后单击 模板 下的 Windows 服务 。 - 类型 名称 文本框然后键入 C:\ 在 位置 文本框中的 LogWriterService 。 单击 确定 。
- 在解决方案资源管理器右键单击 Service1.cs ,然后单击 查看代码 。
- OnStart 事件处理程序中请使用下面的代码替换注释:
EventLog.WriteEntry("My simple service started.");
- 在解决方案资源管理器中,双击 Service1.cs 。
- 在代码编辑器窗口中右键单击 设计视图 ,然后单击 属性
- 在属性窗格中单击 添加安装程序 链接。
- 在属性窗格的 ServiceInstaller 1 中, 更改 ServiceName Service 1 的属性。
- 在设计视图中代码编辑器窗口中,单击 ServiceProcessInstaller 1 。
- 在属性窗格中更改为 LocalSystem (</a0>- LocalService 和 NetworkService 的值是仅在 Microsoft Windows XP 中可用) 的 帐户 属性。
使用编译的安装项目安装 Windows 服务
在完成上一节来配置 Windows 服务项目中的步骤之后,请按照下列添加部署项目打包服务应用程序,以便可以安装服务应用程序的步骤操作:
- 将一个新项目添加到 LogWriterService 项目。 要这样做,请按下列步骤操作:
- 在解决方案资源管理器右键单击 解决方案 LogWriterService (1 项目) 指向 添加 ,,单击 新建项目 。
- 单击 安装和部署项目 下 项目类型 ,然后单击 模板 下的 安装项目 。
- 在 名称 文本框中,键入 ServiceSetup 。
- 类型 位置 文本中的 C:\ 框,然后单击 确定 。
- 通知到包是部署项目。 要这样做,请按下列步骤操作:
- 在解决方案资源管理器右键单击 ServiceSetup ,指向 添加 ,然后单击 项目输出
- 在 添加项目输出组 对话框的在 项目 框中单击 LogWriterService
- 单击 主输出 ,然后单击 确定 。
- 对于正确的安装添加仅主输出。 若要将自定义操作请按照下列步骤操作:
- 在解决方案资源管理器右键单击 ServiceSetup ,指向 视图 ,然后单击 自定义操作
- 右键单击 自定义操作 ,然后单击 添加自定义操作 。
- 单击 应用程序文件夹 ,然后单击 确定 。
- 单击 主输出来自 LogWriterService (Active) ,然后单击 确定 。
请注意 主输出 显示在 安装 、 提交 、 回滚 和 卸载 。
- 默认,安装项目都不算生成配置。 若要生成解决方案,使用下面的方法:
- 方法 1
- 右键单击 LogWriterService ,然后单击 生成 。
- 右键单击 ServiceSetup ,然后单击 生成 。
- 方法 2
- 在 生成 菜单中上, 单击生成整个解决方案的 配置管理器 。
- 单击以选中 生成 复选框为 ServiceSetup。
- 按 F 7 键生成整个解决方案。 当生成解决方案时,您将可以可用于该服务的一个完整的安装程序包。
- 方法 1
- 若要安装新的生成服务,右键单击 ServiceSetup ,然后单击 安装 。
- 在 ServiceSetup 对话框单击 下一步 三次。 注意服务安装时出现进度栏。
- 服务安装单击 关闭 。
验证在工作的
- 在控制面板中双击 管理工具 ,并双击 服务
- 右键单击 Service 1 ,然后单击 开始
- 使用下列方法之一验证的事件日志中记录的事件:
- 方法 1
- 在控制面板中双击 管理工具 ,并双击 事件查看器 。
- 单击在左的窗格中的 应用程序日志 ,然后找到您在从右窗格的服务事件日志。
- 方法 2
- 在服务器资源管理) 器中展开 服务器 、 ComputerName、 事件日志 、 展开 应用程序 ,然后展开 Service 1 。 重新调用 Service 1 是类,非服务的名称本身。 因此, Service 1 用作应用程序名称。 (它是不在本文介绍如何自定义名称的范围之内。
- 光标移日志条目。 第二个条目从顶部应阅读"我的简单服务的启动"。
- 方法 1