C# Windows服务添加安装程序

最近一直在搞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服务项目在前,安装项目在后。

 
以下为微软网站信息(我照上面没有成功,后来发现在12步有问题),按下面成功!
 

创建 Windows 服务的安装项目

此部分介绍如何创建 Windows 服务项目,以及如何安装 Windows 服务中使用已编译的安装项目。

创建 Windows 服务项目

  1. 启动 Microsoft Visual Studio。
  2. 文件 菜单上指向 新建 ,然后单击 项目
  3. 单击 项目类型 下的 Visual C# 项目 ,然后单击 模板 下的 Windows 服务

    请注意 在 Visual Studio 2005 或 Visual Studio 2008,展开 项目类型 下的 Visual C# 、 单击 Windows ,然后单击 模板 下的 Windows 服务
  4. 类型 名称 文本框然后键入 C:\ 位置 文本框中的 LogWriterService 。 单击 确定
  5. 在解决方案资源管理器右键单击 Service1.cs ,然后单击 查看代码
  6. OnStart 事件处理程序中请使用下面的代码替换注释:
    EventLog.WriteEntry("My simple service started.");
  7. 在解决方案资源管理器中,双击 Service1.cs
  8. 在代码编辑器窗口中右键单击 设计视图 ,然后单击 属性
  9. 在属性窗格中单击 添加安装程序 链接。
  10. 在属性窗格的 ServiceInstaller 1 中, 更改 ServiceName Service 1 的属性。
  11. 在设计视图中代码编辑器窗口中,单击 ServiceProcessInstaller 1
  12. 在属性窗格中更改为 LocalSystem (</a0>- LocalService NetworkService 的值是仅在 Microsoft Windows XP 中可用) 的 帐户 属性。

使用编译的安装项目安装 Windows 服务

在完成上一节来配置 Windows 服务项目中的步骤之后,请按照下列添加部署项目打包服务应用程序,以便可以安装服务应用程序的步骤操作:
  1. 将一个新项目添加到 LogWriterService 项目。 要这样做,请按下列步骤操作:
    1. 在解决方案资源管理器右键单击 解决方案 LogWriterService (1 项目) 指向 添加 ,,单击 新建项目
    2. 单击 安装和部署项目 项目类型 ,然后单击 模板 下的 安装项目
    3. 名称 文本框中,键入 ServiceSetup
    4. 类型 位置 文本中的 C:\ 框,然后单击 确定
  2. 通知到包是部署项目。 要这样做,请按下列步骤操作:
    1. 在解决方案资源管理器右键单击 ServiceSetup ,指向 添加 ,然后单击 项目输出
    2. 添加项目输出组 对话框的在 项目 框中单击 LogWriterService
    3. 单击 主输出 ,然后单击 确定
  3. 对于正确的安装添加仅主输出。 若要将自定义操作请按照下列步骤操作:
    1. 在解决方案资源管理器右键单击 ServiceSetup ,指向 视图 ,然后单击 自定义操作
    2. 右键单击 自定义操作 ,然后单击 添加自定义操作
    3. 单击 应用程序文件夹 ,然后单击 确定
    4. 单击 主输出来自 LogWriterService (Active) ,然后单击 确定

      请注意 主输出 显示在 安装 提交 回滚 卸载
  4. 默认,安装项目都不算生成配置。 若要生成解决方案,使用下面的方法:
    • 方法 1
      1. 右键单击 LogWriterService ,然后单击 生成
      2. 右键单击 ServiceSetup ,然后单击 生成
    • 方法 2
      1. 生成 菜单中上, 单击生成整个解决方案的 配置管理器
      2. 单击以选中 生成 复选框为 ServiceSetup。
      3. 按 F 7 键生成整个解决方案。 当生成解决方案时,您将可以可用于该服务的一个完整的安装程序包。
  5. 若要安装新的生成服务,右键单击 ServiceSetup ,然后单击 安装
  6. ServiceSetup 对话框单击 下一步 三次。 注意服务安装时出现进度栏。
  7. 服务安装单击 关闭

验证在工作的

  1. 在控制面板中双击 管理工具 ,并双击 服务
  2. 右键单击 Service 1 ,然后单击 开始
  3. 使用下列方法之一验证的事件日志中记录的事件:
    • 方法 1
      1. 在控制面板中双击 管理工具 ,并双击 事件查看器
      2. 单击在左的窗格中的 应用程序日志 ,然后找到您在从右窗格的服务事件日志。
    • 方法 2
      1. 在服务器资源管理) 器中展开 服务器 ComputerName事件日志 、 展开 应用程序 ,然后展开 Service 1 。 重新调用 Service 1 是类,非服务的名称本身。 因此, Service 1 用作应用程序名称。 (它是不在本文介绍如何自定义名称的范围之内。
      2. 光标移日志条目。 第二个条目从顶部应阅读"我的简单服务的启动"。
原文地址:https://www.cnblogs.com/liufei88866/p/2001019.html