原文地址:http://www.cnblogs.com/HopeGi/archive/2013/06/05/3118270.html
在某年的一个暑假,很想把已经写好的“锄大地”游戏跟冯Boy分享一下,可是那时候不会做一个自动安装.NET Framework4.0的安装包,很遗憾无法跟她分享我的成果。
最近上头有任务,让我去为团队的成果打一个包,而且项目运行时必备的SQL Server、.NET Framework都要一键安装,项目用到的数据库和端口都要在安装的时候一同搞好,这回总算是会了。
安装项目介绍
新建一个安装包的项目
建好了项目之后就有这个界面:文件系统编辑器
还有其他类型的编辑器。
由左往右分别是:文件系统编辑器,注册表编辑器,文件类型编辑器,用户界面编辑器,自定义操作编辑器,启动条件编辑器。
到现时为止,只用到三个编辑器
- 文件系统编辑器:编辑安装到目标计算机后,各个文件放置的情况,就上面那幅图所示,“应用程序文件夹”里塞的就是程序所有东西;“用户的‘程序’菜单”就是开始菜单中的内容,这里一般会有程序的快捷方式、卸载程序;“用户桌面”就是桌面上方的东西了,一般就有程序的快捷方式了,如果特别一点的就像酷狗的弄多一个文件夹出来。
- 用户界面编辑器:这个用于编辑安装程序时弹出的界面,可以调换各个对话框出现的顺序,如果有需要的话,就可以另外增加一些别的对话框,例如填上数据库的实例名,IP地址,端口号之类的。
- 自定义操作编辑器:当在安装过程中还要做其他的操作,例如附加数据库,文件复制等等,就需要这个自定义操作了。自定义操作则需要另外加项目,一个类库项目,关键的是类库里面需要一个安装程序类
安装包制作
介绍完各个编辑器之后开始制作安装包了
打开“文件系统编辑器”,右击应用程序文件夹 —》 添加 —》 文件,在弹出的对话框选择要安装到目标计算机里面的文件(包括exe和dll)
通过类似的方式可以在“用户‘程序’菜单”和“用户桌面”里面添加内容。最简单的就是添加快捷方式
如果要在安装过程中做一些操作(拷贝某些文件,开端口,附加数据库等等),则要编写安装程序类了。在上面说的那个Installer1类中
可以重写一些方法根据各个不同是的时候选择适合的方法,这里就OnBeforeInstall方法。
protected override void OnBeforeInstall(IDictionary savedState) { //从用户界面获取的参数 string portId = Context.Parameters["PortId"]; base.OnBeforeInstall(savedState); //自己定义的一个利用命令行开放端口的方法 OpenPort(portId); }
安装程序类定义好之后,回到“文件系统编辑器”添加一个项目输出
选择刚才安装程序类所在的项目。
接着到“自定义操作编辑器”在安装的节点右键—》添加自定义操作,在弹出的对话框选择刚才添加的主输出*****
上面开放端口需要一个端口号,而这个端口号则是从用户界面传入的。在“用户界面编辑器”中的启动节点右击—》添加对话框,弹出的对话框选择适当类型的对话框。
这里只选择文本框(A)就足够了。
编辑这对话框的内容,可以在属性窗口编辑。
这里有BannerBitmap,BannerText,BodyText和四组Edit开头的属性,相信通过这幅图就知道各个属性的含义了,EidtVisible就是控制那组文本框是否显示
而这里只需要把Eidt1的显示就可以了,并且各个属性设成这样
然后回到自定义操作处编辑打开主输出****的属性窗口,给CustomActionData属性附上这样的值
/PortId="[PORTID]"
等号前的是安装程序类的Context.Parameters["PortId"];里面的参数名,后面的PORTID是用户界面EditPorert属性的值,这如果有多个参数的话 要用空格隔开,如:
/Para1="[PARA1]" /Para2="[PARA2]"
整个安装程序大致完成了,最后要是程序运行的时候要有什么必备的组件,例如(.NET Framework),就要在安装项目右击,打开属性窗口,点击系统必备,选择必备要组件。
这里放一个小插曲,如果在这里勾选了SQL Server 2005 Express的,在生成的时候报错了,本人尝试在安装程序类中利用代码调用命名一键安装SQL Server,可是失败了,原因是系统只允许一个Instraller运行。最终还是得勾选SQL Server 2005 Express的,至于解决方法,得参照另一篇博文《自定义系统必备》
右击安装项目生成,安装包就生成了
Setup.exe是一键安装组件的安装程序,msi后缀的安装程序是跳过了组件安装的安装程序。到这里安装包的制作算是完成了。要是在那个暑假我懂得这些,就能跟冯Boy分析我编写的小游戏了,遗憾呐!
本文的思绪有点紊乱,还得请各位多多指教。谢谢!