前言:作为一名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

  参考这边文章:https://stackoverflow.com/questions/11139538/could-not-find-required-file-setup-bin

  处理方案二:如果上面解决不了你的问题,你可以通过VS2017安装程序中的组件安装,安装一下组件:Visual Studio SDK,如下图:

  发布错误2-清单中的引用与下载的程序集标识不匹配?

  解释:这个问题当然也google了,意思就是你需要改下项目的属性-->安全性->  勾选:启用ClickOnce安全设置,和,这是完全可信任的应用程序。   参考文章:https://blog.csdn.net/soft_123456/article/details/38080667

  也有人解释的更深一步,说是项目的引用程序集版本号与实际程序集版本号不一致导致的,参考文章:https://blog.csdn.net/linybo/article/details/44699315

  我自己走的是第一个方案,你们可以自己去研究去尝试,时间有限,事情繁多,没有仔细去试。

  小结:其实上面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

  装好后就有了,通过这个自定义的安装项目,我们可以把需要文件都扔进去,当然还需要把服务的配置文件一并扔进去。

  详情介绍请看我的另一篇博文:https://www.cnblogs.com/lxhbky/p/10695527.html

  总结:由于没有太多的时间整理,先这样写吧,基本上把我自己使用这个winform+window服务这种组合项目,在发布过程中以及,怎么创建自定义安装包来快速,部署到测试中,遇到的问题说全了,希望可以帮助到遇到类似问题的道友。。。

以后再整理文章的结构。。。

最新文章

  1. nodejs与v8引擎
  2. [js开源组件开发]ajax分页组件
  3. ICSharpCode.SharpZipLib简单使用
  4. UVA 10815 Andy's First Dictionary ---set
  5. shell脚本批量处理字符串
  6. EasyUI datagrid 格式化显示数据
  7. 什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别
  8. 将Excel文件.xls导入SQL Server 2005
  9. SSAS 聚合设计提升CUBE的查询性能(转载)
  10. drawRect & 内存 -> 深究
  11. JavaScript中typeof,instanceof,hasOwnProperty,in的用法和区别
  12. jquery自定义进度条与h5原生进度条
  13. Rails rspec测试报patch user_path(user) param not found: user的解决
  14. 413 重温HTML + css 考试 + 访问HTML元素
  15. nodeJs 控制台打印中文显示为Unicode解决方案
  16. StringBuilder and StringBuffer
  17. OpenProject 分类专栏说明
  18. Summary on mapreduce.framework.name init error
  19. 学习windows编程 day6 之处理鼠标移动
  20. ext中grid根据数据不同显示不同样式

热门文章

  1. Python并发编程之创建多线程的几种方法(二)
  2. 学习Layui 第一天
  3. 结构化您的Python工程
  4. 【线程系列四】[转]监听器-java同步的基本思想
  5. SSM-SpringMVC-05:SpringMVC视图解析器InternalResourceViewResolver配置
  6. Ubuntu安装和卸载.bundle格式的VMware
  7. Clloection接口 与List接口
  8. Prefer ThreadLocalRandom over Random
  9. go源文件中是否有main函数
  10. BZOJ_4004_[JLOI2015]装备购买_线性基