当前位置: 首页 > news >正文

(转)为C# Windows服务添加安装程序

本文转载自:http://kamiff.iteye.com/blog/507129

最近一直在搞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服务了。其实简单的做法只要在安装,提交,回滚,卸载 都添加项目的主输出的话也是可以达到自动注册/卸载服务 功能的,而且不依赖于InstallUtil.exe(如图15)





(图15)

接下来就该让Windows服务和安装项目同时被编译了。右键点击解决方案,选择“属性”(如图16),在出来的对话框中,勾上安装项目后面的生成。(如图17)




(图16)




(图17)

最后,右键解决方案,选择“生成解决方案”,这时vs会将两个项目都会编译出来。不过要注意一点:项目的启动顺序一定要Windows服务项目在前,安装项目在后。

 

转载于:https://www.cnblogs.com/wpcnblog/p/3695644.html

相关文章:

  • db2的bufferpool不足报错的快速解决
  • 《明天会有温暖的家》
  • android的NDK和java进行本地socket通信
  • Hadoop学习笔记3:org.apache.hadoop.conf
  • 远程桌面与远程控制
  • [leetcode] Balanced Binary Tree
  • 运维的我要学开发--Python(4)
  • Ubuntu 14.04配置记录
  • 【笔记】设计模式——装饰者模式
  • IsBadStringPtr、IsBadWritePtr
  • OC语言BLOCK和协议
  • js学习记录
  • C++容器操作
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • 引用动态链接库Dll文件 引用失败 未能添加对HD.dll的引用。请确保此文件可访问并且是一个有效的程序集或COM组件...
  • 分享一款快速APP功能测试工具
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Facebook AccountKit 接入的坑点
  • Less 日常用法
  • Logstash 参考指南(目录)
  • PHP那些事儿
  • Python中eval与exec的使用及区别
  • 代理模式
  • 订阅Forge Viewer所有的事件
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 后端_ThinkPHP5
  • 两列自适应布局方案整理
  • 前端存储 - localStorage
  • 实现菜单下拉伸展折叠效果demo
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 移动端解决方案学习记录
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​渐进式Web应用PWA的未来
  • #Lua:Lua调用C++生成的DLL库
  • (003)SlickEdit Unity的补全
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (4.10~4.16)
  • (层次遍历)104. 二叉树的最大深度
  • (二)springcloud实战之config配置中心
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十五)使用Nexus创建Maven私服
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .Net IE10 _doPostBack 未定义
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @JSONField或@JsonProperty注解使用
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘