最近开发了一个WinForm软件,为了更加高大尚尝试做了个打包安装的包装。因为以前直接编译,然后交给用户使用,基本也是平平安安的;但后来这样体现不了成熟软件的高大尚,那好吧就弄个一键安装部署的。本来在第一次选型选了NSIS (Nullsoft Scriptable Install System) ,功能比较强大,但发现这个太基于代码了,要学习的成本比较高,所以还是寻觅其他的。后来发现还是Setup Factory,这个中规中矩吧。没有太多花俏的功能,就简单的Next,Next,Finish.但如果这么简单也不会有这篇文章了。
这文章的重点来了,我这个WinForm软件自带比较强的后台服务属性,安装后需要进行服务注入和服务启动;所以如果简单的Next,Next,Finish,用户还要操作一大堆工作,那怎么办好呢?只好在安装时由安装软件进行自动后台安装。首先要面对的是根据安装的目前对Sqllite的数据库地址进行指引,就是说用户选择安装目录后,安装软件会自动修改软件的ini配置文件,指定相关地址,那怎么写呢?看了一圈E文API后发现Setup Factory有这个功能。就是INIFile这个,这个有读取、删除、和写入。写入如下
代码语言:javascript复制INIFile.SetValue(SessionVar.Expand("%AppFolder%\配置文件.ini"), "数据库设置", "分拣数据库位置",SessionVar.Expand("%AppFolder%\DB.db"));
这样解决了因为用户选择目录而导致配置数据库地址的问题,接下来就是服务的注入。这个好在我是写一个程序,只需要在将程序注入到服务可以了,于是我用了Shell.Execute这个API,这个就是用来执行文件的。
代码语言:javascript复制Shell.Execute(SessionVar.Expand("%AppFolder%\后台服务.exe"), "open", "install", "", SW_HIDE, false);
这里的后台服务.exe就是我的服务程序,install就是安装,后面的SW_HIDE和False分别是隐藏窗口和不用等待(异步)。当然这样还不行,还有让它启动,这个也是一样。
代码语言:javascript复制Shell.Execute(SessionVar.Expand("%AppFolder%\后台服务.exe"), "open", "start", "", SW_HIDE, false)
但又遇到一个问题,就是服务还没注入成功就直接启动服务,这样明显不行的,怎么办呢?好在这时发现有一个等待函数
代码语言:javascript复制Application.Sleep(800);
这样就让它等待800秒再执行。
好了,万事具备就找个位置执行这些代码,放哪里好呢?放在开始肯定不行,因为文件还没复制完,所以根本不会执行,所以只能安装完成。于是我放在安装后和安装成功展示画面前。。这样就顺利地搞掂了。。
最后说一下吧,Setup Factory作为一个老牌的安装打包软件的确不错,它比较四平八稳,但就是没有太多花俏的功能。国产也有很多安装打包的软件功能也不错,但一些花俏的功能就收费了。这个自己衡量吧。
本篇也到此为止,最后多谢你的阅读。这篇也不小心的变成我这里的第100篇原创文章。。可喜可贺