CSharp制作MSI安装文件
前言:MSI文件和EXE文件区别
在Windows上安装软件的时候,一般有两种方式:
Windows安装包(.msi)
Windows二进制文件(.exe)
这两种安装方式的区别如下:
.exe是一个安装引导程序。它是安装工程通过MSBuild创建的,其中包含了一个XML文件,定义了应用程序所需要的系统必备安装包信息。Setup.exe程序会检查这些系统必备安装包是否需要被下载和安装,如果需要,它就会先安装那些系统必备程序。当我们运行它的时候,它会读取setup.ini来确定安装所需要的配置并开始安装流程。
.msi是一个Windows安装包。和.exe不一样,直接运行MSI安装包不会自动安装自定义系统必备。它只会安装主应用程序。当我们“运行”它的时候,其实是Windows Installer在执行MSI包定义的各项操作。因此我们需要安装Windows Installer的正确版本(也就是需要先安装程序运行起来的必备环境)才能运行.msi。
另外,
.msi是微软的自解压文件,如安装某些软件时就是这种文件格式打包而成的,Windows系统中自带有软件将其解压。正如WINRAR可以将文件压缩成.rar文件,也可以将.rar文件解压一样;
而.exe是可执行文件类型,通俗一点来说.exe文件是不依靠其他软件而单独运行的文件(当然不能脱离系统),因为.exe就是软件。
最后,
msi是Windows installer开发出来的程序安装文件,是Windows installer的数据包,把所有和安装文件相关的内容封装在一个包里了。
.exe也允许你安装程序,但程序员在开发.exe的时候要比开发.msi困难的多,需要人工编写和安装,修改,卸载相关的很多内容。而msi把这写功能都集成化了,易于开发Windows程序安装包。
VS程序项目右键“发布”的就是.exe文件
VS使用插件制作的打包文件就是.msi文件
上一篇博文讲到如何制作.exe文件,今天主要讲.msi文件的制作,打包,签名流程
制作过程:
- 打开我们写好的程序(还是拿昨天的简易计算器制作)
- 在制作之前,我们先给我们的程序加上图标
- 在主项目底下添加一个文件夹用于存放我们的程序安装Logo和程序运行界面Logo
添加程序启动的界面Logo-jisuanqi.ico和程序发布Logo-Logo.ico。如图
- 给界面加图标
- 运行程序查看是否添加成功
如图所示表示添加成功。接下来我们就可以开始制作打包程序
- 右键项目的解决方案,新建windows程序安装项目FormPackageSetup
- 新建完会出现如下截图界面
英文的就是如下所示
- 文件说明
应用程序文件夹:表示要安装的应用程序需要添加的文件
用户的“程序”菜单:表示应用程序安装完,用户的"开始菜单"中的显示的内容,一般在这个文件夹中,需要再创建一个文件用来存放:应用程序.exe和卸载程序.exe
用户桌面:表示这个应用程序安装完,用户的桌面上的创建的.exe快捷方式 - 添加程序文件(应用程序文件夹)
在应用程序文件夹,点击右键添加文件:添加要打包的文件(添加的文件一般是已经编译过应用程序的debug目录下的文件) (也可以直接如下一步操作一样直接项目输出)
如果debug下面有子文件则需要"添加文件夹",例如Image,然后将对应子文件里的内容添加到此文件夹中,方便给程序添加快捷方式图标;
- 选择应用程序文件夹(Application Folder)----右键----Add----项目输出,添加自己的项目即可,如下图:
直接点击“确定”即可自动添加相应文件
- 添加卸载程序。即在添加你的应用程序项目的时候,多添加一个msiexec.exe进去,这个文件在c:\windows\system32文件夹下
添加后如图所示
- 为程序创建快捷方式(添加用户的程序菜单)
选中主输出FormInstallPackageDemo(活动) ----右键----“create shortcut to 主输出FormInstallPackageDemo(活动)” 和右键卸载程序创建卸载快捷方式。 创建出来的快捷方式是可以修改的,然后把这个拖放到用户桌面【User's Desktop】,再重复一遍这个步骤,拖放到用户的程序菜单【User's Program Menu】中
-
- 创建用户的“程序”菜单快捷方式
前面把创建的快捷付方式拖放到用户桌面了,这里就还需要创建一个程序快捷方式,同卸载快捷方式一起放到用户的“程序”菜单文件夹中(也可以在用户的程序菜单里新建一个文件夹,将快捷方式统一放到这里,方便管理) - 创建完后三个文件夹及里面内容如图所示
-
用户菜单界面及卸载的快捷方式设置一样
- 设置卸载属性
鼠标左键单击项目名称,记住是左键单击,然后点击属性标签,注意:不是右击的属性
将code复制到卸载快捷方式的Argument属性时,需要在code前面加【/x 】,x后面有空格,x不分大小写,即在Aguements属性中输入"/x {ProductCode}"
- 加入.NET系统组件
鼠标右键项目,点击属性加入组件
- 设置系统必备
点击确定后,在属性页点击应用,确定关闭属性窗口
- 点击项目,选择"生成"即可在我们刚才设置的目录下生成带有卸载功能的安装程序了
生成后如图所示
- 完成以上步骤,生成下即可得到msi安装文件
-
上面只是图解了VS2010项目的主要步骤,如果需要更改图标,路径,加入公司名等等一些操作,都可以在部署项目的相应属性中设置
- 安装,验证程序
msi文件和exe文件都可以运行安装,安装后,如图所示
桌面上有快捷方式
用户菜单界面图示
双击运行程序
卸载程序
至此msi安装文件打包完成。
- 如果只是生成了msi文件,用户安装的时候比较麻烦,像安装一般软件一样,需要用户慢慢点击下一步,慢慢安装,在本项目中采用打包成cab文件的方式,做到用户点击运行后,即可自动安装。
- 打包为cab
在这里需要准备文件有:可以在桌面上新建一个文件夹存放这四个文件cabarc.exe:微软提供的cab打包工具FormPackageSetup.msi: 本案例中FormPackageSetup项目生成的windows部署安装文件install.inf : 需要跟FormPackageSetup.msi打包在一起的文件,制作方法请见下文build.bat: 打包的批处理命令,制作方法请见下文 - install.inf制作。新建txt文件,加入以下内容,将文件名重新命名为install.inf即可。其中FormPackageSetup.msi即是要打包的安装程序的名称。
[version] signature="$CHICAGO$" AdvancedINF=2.0 [Setup Hooks] hook1=hook1 [hook1] run=msiexec.exe /i "%EXTRACT_DIR%\FormPackageSetup.msi" /qn
- build.bat制作。新建txt文件,加入以下内容,将文件名重新命名build.bat即可。其中FormPackageSetupCab.cab是生成目标cab的名称;install.inf是第一步生成的文件名,而FormPackageSetup.msi是需要打包的安装程序名;第二条ping命令仅仅是让批处理不要那么快退出,起到更利于观察生成结果的作用
"cabarc.exe" -s 6144 n FormPackageSetupCab.cab install.inf FormPackageSetup.msi ping -n 20 127.0.0.1 >nul
- 双击build.bat批处理命令即可生成cab文件
双击bat后的运行结果如下,其中FormPackageSetupCab.cab即是生成的目标cab文件。
- 待更新...