使用C#开发windows服务定时发消息到钉钉群_群组简单消息
前言:作为一名c#开发人员,避免不了常和windows服务以及winform项目打交道,本人公司对服务的管理也是用到了这2个项目的组合方式进行:因为服务项目是无法直接安装到计算器中,需要使用命令借助微软的一个程序使用,因此做服务安装工作的活就交给winform去做了。
关于window服务+winform项目的创建过程,可参考我的另一篇文章:使用c#开发windows服务定时发消息到钉钉群_群组简单消息
这边文章只探讨:组合项目在发布及部署过程中遇到的很多问题。 现在建设你已经顺序创建了这2个项目,并完成了功能的开发:
开发工具:vs2017,操作系统:windows
问题汇总如下:
发布错误1-未能在clickonce bootstrapper中找到setup.bin?
解释:首先你要确保你的vs安装了clickonce功能,没有开启的话,开启一下,使用vs安装程序即可开启。
处理方案一:网上扒了一大堆资料,总体意思就是说:缺少sdk,需要重新安装一下: microsoft windows sdk for windows 7 and .net framework 4
参考这边文章:
处理方案二:如果上面解决不了你的问题,你可以通过vs2017安装程序中的组件安装,安装一下组件:visual studio sdk,如下图:
发布错误2-清单中的引用与下载的程序集标识不匹配?
解释:这个问题当然也google了,意思就是你需要改下项目的属性-->安全性-> 勾选:启用clickonce安全设置,和,这是完全可信任的应用程序。 参考文章:
也有人解释的更深一步,说是项目的引用程序集版本号与实际程序集版本号不一致导致的,参考文章:
我自己走的是第一个方案,你们可以自己去研究去尝试,时间有限,事情繁多,没有仔细去试。
小结:其实上面2个错误,虽然都尝试过,但是最好还是并没有真正解决我的问题,我发布后还是出现类似莫名其妙的错误,这可能也与我的一个操作过程有关(我原本用的vs2015,又安装了vs2017,装好17后就把15给卸载了),
我的终极解决方案是:使用vs2017自带的安装程序,重新又修复了一下vs的整个程序,然后上面2个问题就都迎刃而解了。不明觉厉! 可能真的我操作过程导致的,然后如果你修复vs程序后还不行,可以参考上面的解决方案,逐个去试吧,我们程序员就爱干这个。
这篇文章的主要内容是下面:
发布错误3-正常情况下,winform项目和服务项目没有直接关联关系,winform可以将服务exe路径写死,进行服务的安装和卸载即可。 但是本人就是想搞一个测试的按钮,在winform中引用服务项目,调用服务中的类进行方法测试,而服务在自动运行的过程中就又跟winform程序无关了。 项目是可以通过vs直接使用发布功能了。
我这里只发布了winform项目,由于项目存在引用关系,winform发布的文件中自动包含了一个服务的exe程序集,太高兴了,就不用再单独发布服务项目了,但是发布后,在安装服务后遇到了一个关键问题:服务的程序集exe,是deploy类型,无法直接使用,太奇怪了,后来发现这块是可以设置的:项目属性->发布->安装模式和设置选项->部署-> 取消勾选:使用".deploy文件扩展名",我是这么解决的,你们*发挥哈!!
下一步:服务是可以正常安装了,没毛病,但是服务运行过程中,读配置文件app.config时(我加了日志发现的,你不加日志是发现不了的,除非报异常),找不到数据了?缺少服务的配置文件?
其实想想也是,即使已经有了exe程序集,但是我只发布了一个winform项目,那发布文件中,肯定只有一个winform的配置文件了,怎么可能会有服务的配置文件呢,服务的exe也只是一个程序集供winform使用,就好像一个dll一样,在你winfrom只用调用服务类中方法时,走的也是winform的配置文件。 但是关键是脱离winform的管理后,服务会独立运行,如果服务自己有配置文件,那服务执行过程中肯定会出现问题,怎么去保证:2个配置文件同时存在,且又不用发布2个项目呢?
(如果你的服务项目不需要配置文件除外;如果你2个项目分开发布也没有问题,分开发布需要在winform中指定服务exe程序集的位置,不能使用引用的exe程序集,因为它默认没有配置文件,除非你不要配置文件;)
最简单的解决方案:我们不使用发布功能不就完了,编译后的项目,bin/debug目录下的文件是可以直接使用的,直接copy到服务器就可以了。这种方案,咱们研发人员当然ok了,我们公司就是这么做的,不需要发布,就再调整一下服务的路径就可以在测试服务器用了。
当然我的项目是,通过安装程序,发布功能,走一个包装过程,然后小白也能直接安装的,那么接着往下看:
解决方案一:像上面分析一样,把服务的配置文件数据写死到服务中。 太粗暴了,不便于维护。
解决方案二:2个项目分开发布,各个走各自的配置,互不干扰,但是需要在winform中指定服务程序集exe的具体路径。 稍微麻烦
推荐解决方案三:其实自己看,winform的发布文件可以看出,发布的文件其实也就是一个安装程序,发布选项中,可以查看程序集文件,设置必须的系统组件,清单,说明等,那么可以总结为:如何在安装程序中,添加2个配置文件进去?
后来在发布里面始终找不到答案,太tm烦人了,不过后来想到了一个解决方案,就是vs是有自定义安装程序的项目,叫:setup project,vs2010,2015自带这个项目的,但是vs2017给砍掉了,做成了一个插件,需要自己去安装,妹的!
你们可以搜索:microsoft visual studio 2017 installer projects,在vs的插件扩展中,或者vs官网都可以。我是通过官网装的:https://marketplace.visualstudio.com/items?itemname=visualstudioclient.microsoftvisualstudio2017installerprojects
装好后就有了,通过这个自定义的安装项目,我们可以把需要文件都扔进去,当然还需要把服务的配置文件一并扔进去。
自定义安装程序的操作方法:
安装项目主要有:左侧3个菜单(项目主要文件,用户桌面,用户开始菜单),一个需要配置的项目属性(系统必备安装环境)
1-添加项目主要文件:在项目文件右键->add->项目输出->选择winform项目-主输出,然后安装程序会自动把依赖的文件全部加进来,非常好使。最后别忘了关键的异步,把服务的config文件单独再拉进来:
2-添加用户桌面文件:一般我们会在用户桌面生成一个程序的入口文件的快捷方式,就是启动项目的文件。在项目文件中,选中winformexe文件,右键创建快捷方式,然后拖到用户桌面左边的:用户桌面菜单中。
3-添加用户程序菜单也一样,放入一个入口文件的快捷方式文件,一般还有再加一个卸载该程序的文件入口:
首先,我们需要在项目文件中,add一个微软提供可供卸载程序的一个程序集: c:\windows\system32\msiexec.exe, 然后同样创建一个快捷方式,拖入到用户程序菜单中,右键快捷方式属性,在参数中输入:\x {projectcode}
其中projectcode,是需要在setup项目的属性中(不是右键属性哦,选中安装项目,属性窗口中的属性),可以找到,然后粘贴进去,就完成了卸载程序快捷方式的创建:
4-设置安装程序的运行环境及必备系统组件:选中setup安装项目,这次是右键点击属性添加系统必备组件,如下图:
最后编译setup项目,就可以了,找到debug下的文件,就可以进行傻瓜式一键安装了,自定义安装文件一共就产生了2个文件,类似于安装包的作用,把我们的发布后的文件又进行了一次压缩,漂亮啊:
注意:默认自定义安装项目,是不编译的,除非你单独编译安装项目。 你如果你是编译的解决方案,那么你其实并没有编译安装项目,解决方案中可以设置安装项目编译:
5-添加快捷方式图标,图标需要在项目文件中添加几张ico类型的图标文件,添加好之后,可以在快捷方式的属性栏的icon中选择添加的图标文件。这一步可忽略,主要是为了美观!
效果图:
用户菜单快捷菜单入口:
桌面快捷方式入口:
总结:由于没有太多的时间整理,先这样写吧,基本上把我自己使用这个winform+window服务这种组合项目,在发布过程中以及,怎么创建自定义安装包来快速,部署到测试中,遇到的问题说全了,希望可以帮助到遇到类似问题的道友。。。
以后再整理文章的结构。。。