介绍

给windows系统做软件,常见的打包工具大家可能都听说过,如:大名鼎鼎的Installshield、Inno setup等。在遇见Wix之前InstallShield时我的主力打包工具,操作简单方便项目使用到的dll文件会自动添加,多语言支持也很好,不过不好的是免费版的功能就那几样,越来越无法满足自己的要求。后来就尝试了下Inno setup,这个是用脚本进行配置并生成安装包的,简单尝试之后发现实在麻烦还不好配置,于是就放弃了。再后来就遇到了WixToolSet,这个瑞士军刀一样的打包工具还是免费开源的,已经与VS整合到了一起,安装界面还可以根据WPF一样的xaml标签自定义样式,很是不错,但是国内教程较少而且有些说的也不是很清楚,学起来比较有难度。
之前的老项目升级了,打包时发现wix的打包流程又忘记了,所以这篇教程给自己提个醒,也就给大家带来了一个简单的快速入门教程。

要求

一个winform做的程序:

  1. 可以自定义安装位置
  2. 升级包可覆盖安装,不允许降级安装
  3. 桌面和开始菜单有启动/卸载的快捷方式
  4. 支持中文

开始

1.wix安装方法简单提一下:

去Wix官网下载wix的安装包,然后进行安装。完了之后打开vs2017(vs2015)的扩展和更新,搜索【wix】,搜索到之后下载安装,然后重启vs即可。

2.新建wix项目


如图,选择v3类型的项目,不然本文接下来的代码可能不能用。

3.项目结构

具体结构简介,参考Wix 安装部署(一)同MSBuild 自动生成打包文件 这里不再赘述。

我的项目结构:

其中Product.wxs文件中有个Product节点:

这个节点里有三个属性比较重要,涉及到了上面要求中的软件升级部分。分别是:Id,Version,UpgradeCode。Id和UpgradeCode是GUID码,Version与微软定义的那一套Version一致,一共四部分组成,前三部分有变化才认为你的程序版本有变化。

我的项目中:
1. LibFiles文件夹:是我的项目中用到的所有的dll、config等文件。
2. Icons文件夹:是用到的一些图标。
3. References中添加了四个引用:第一个是我的winform程序要的库项目(dll),第二个是我的winfrom程序,这两个项目引用添加进来的目的就是为了项目代码有任何改动时,wix生成的包一直都是最新的。第三个和第四个是前面的那个链接中讲过,自定义安装界面所需要的两个dll。
4. license.rtf:是你程序的license。

4.Product.wxs的配置代码

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"><Product Id="*"  Name="软件名称v2.0.0" Language="2052" Codepage="936" Version="2.0.0.0" Manufacturer="公司名称" UpgradeCode="6b89c3a7-f25c-4399-9df8-d0b40105cd82"><Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /><MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /><MediaTemplate /><!--安装清单--><Feature Id="ProductFeature" Title="SetupWixTest" Level="1">    <!--Feature安装清单--><ComponentGroupRef Id="ProductComponents" /><ComponentRef Id="LibsAndFiles"/><ComponentRef Id="ApplicationShortcut"/><ComponentRef Id="DesktopFolderShortcut"/></Feature><WixVariable Id="WixUILicenseRtf" Value="license.rtf"/><UI>                                                                  <!--安装风格--><Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"/> <UIRef Id="WixUI_InstallDir"/></UI></Product><Fragment><Directory Id="TARGETDIR" Name="SourceDir"><Directory Id="ProgramFilesFolder" Name="PFiles"><Directory Id="INSTALLDIR" Name="SmartTool">                      <!--用户选择安装位置--></Directory></Directory><Directory Id="ProgramMenuFolder">                                 <!--在windows开始菜单中显示--><Directory Id="ApplicationProgramsFolder" Name="软件名称"/></Directory><Directory Id="DesktopFolder" Name="Desktop"/></Directory></Fragment><Fragment>                                                                  <!--定义需要添加的文件的位置--><ComponentGroup Id="ProductComponents" Directory="INSTALLDIR"><!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. --><Component Id="ProductComponent"><File Id="SmartTool.exe" Source="$(var.TianHuangPing.TargetPath)"/></Component><Component Id="LibOne"><File Source="$(var.OrderFoodLib.TargetPath)"/></Component></ComponentGroup><DirectoryRef Id="INSTALLDIR">                                      <Component Id="LibsAndFiles" Guid="ae8c83a1-7615-4439-bf90-4c39db24986f"><File Id="AutoChangComboBox1.dll" Source="LibFiles/AutoChangComboBox.dll"/><File Id="AutoChangCombo1Box.dll" Source="LibFiles/DevExpress.BonusSkins.v16.2.dll"/><File Id="AutoCha1ngComboBox.dll" Source="LibFiles/DevExpress.Data.v16.2.dll"/><File Id="AutoChang1ComboBox.dll" Source="LibFiles/DevExpress.Printing.v16.2.Core.dll"/><File Id="AutoChangC1omboBox.dll" Source="LibFiles/DevExpress.Sparkline.v16.2.Core.dll"/><File Id="AutoC1hangComboBox.dll" Source="LibFiles/DevExpress.Utils.v16.2.dll"/><File Id="AutoChangComboww1Box.dll" Source="LibFiles/DevExpress.XtraBars.v16.2.dll"/><File Id="Aut1oChangComboBox.dll" Source="LibFiles/DevExpress.XtraEditors.v16.2.dll"/><File Id="AutoChangCo1mboBox.dll" Source="LibFiles/DevExpress.XtraGrid.v16.2.dll"/><File Id="AutoCh2angComboBox.dll" Source="LibFiles/DevExpress.XtraLayout.v16.2.dll"/><File Id="AutoChangC2omboBox.dll" Source="LibFiles/DevExpress.XtraPrinting.v16.2.dll"/><File Id="Au2toChangComboBox.dll" Source="LibFiles/Impinj.OctaneSdk.dll"/><File Id="AutoC2hangComboBox.dll" Source="LibFiles/LLRP.dll"/><File Id="AutoChangCombo2Box.dll" Source="LibFiles/LLRP.Impinj.dll"/><File Id="AutoChangCombo22Box.dll" Source="LibFiles/MR6100Api.dll"/><File Id="configFile" Source="LibFiles/TianHuangPing.exe.config"/><File Id="mannifestFile" Source="LibFiles/TianHuangPing.exe.manifest"/></Component></DirectoryRef><DirectoryRef Id="ApplicationProgramsFolder"><Component Id="ApplicationShortcut" Guid="5A254682-DD5F-453D-8333-144457282026"><Shortcut Id="LunchApplicationShortcut" Name="软件名称" Description="启动软件名称" Target="[INSTALLDIR]TianHuangPing.exe" WorkingDirectory="INSTALLDIR"><Icon Id="ico_install" SourceFile="Icons/logo.ico"/></Shortcut><Shortcut Id="UninstallApplicationShortcut" Name="卸载软件名称" Description="卸载软件名称" Target="[SystemFolder]msiexec.exe" WorkingDirectory="SystemFolder"  Arguments="/x [ProductCode]"><Icon Id="ico_uninstall" SourceFile="Icons/logo.ico"/></Shortcut><RemoveFolder Id="ApplicationProgramsFolder" On ="uninstall"/><RegistryValue Root="HKCU" Key="Software\Microsoft\SmartTool" Name="installed" Type="integer" Value="1" KeyPath="yes"/><util:InternetShortcut Id="OnlineDocumentationShortcut" Name="获取在线帮助" Target="http://www.hdu.edu.cn"/></Component></DirectoryRef><DirectoryRef Id="DesktopFolder"><Component Id="DesktopFolderShortcut" Guid="5A254676-DD1F-453D-8333-144457282027"><Shortcut Id="DesktopShortcut" Directory="DesktopFolder" Name="软件名称" Target="[INSTALLDIR]TianHuangPing.exe" WorkingDirectory="INSTALLDIR" Icon="ico_install"></Shortcut><RegistryValue Root="HKCU" Key="Software\Microsoft\SmartTool" Name="installed" Type="integer" Value="1" KeyPath="yes"/></Component></DirectoryRef></Fragment>
</Wix>

这个配置文件不是很难懂,大部分都可参考Wix 安装部署(一)同MSBuild 自动生成打包文件 进行理解。这个链接看完之后,我们要求里的第1,2,3点你应该都可以实现了。不过第2点中的升级包如何安装覆盖,我再详细解释一下:

Product标签中的id、upgradecode、version属性来控制版本的升级和降级。你的产品每次发布一个新版本,id都要分配一个新的GUID,version都要分配一个新的version,但是upgradecode要用同一个(不能改变)。即:同一个产品只用同一个upgradecode,不同的upgradecode认为是不同的产品,同一个产品的不同版本用不同的id和version。这里id属性我赋值为“*”,表示每次生成安装包wix会自动在这里分配一个新的GUID,不用我自己管。

所以,新版本安装包的制作流程是:

  1. upgradecode保持不变。
  2. version从1.0.0.0换成1.0.1.0.
  3. id设置为*,或者赋值一个新的GUID。

这样新的安装包安装时才不会提示与旧的冲突,也不会变成安装了两个完全一模一样的软件。

对于需求中的第4点,制作一个中文安装包:
此时如果你编译项目的话肯定时编译不过去的,因为Product.wxs中有中文的存在。如果需要安装界面时中文的,而且配置文件中的中文也要能够显示在界面上,就需要在这里配置成zh-CN。如要制作其他的语言包,请自行参考官方文档。
右键你的项目–属性:

5.展示


重要提示:在编写你的Product.wxs配置文件过程中一定要记得把bin文件下的所有dll、.config、.manifest等重要的文件配置进去,否则会有问题。

参考:
随笔分类 -Wix
WiX Toolset Manual Table of Contents

【C#】WixToolset快速入门教程相关推荐

  1. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  2. ​HealthKit开发快速入门教程大学霸内部教程

    ​HealthKit开发快速入门教程大学霸内部教程 ​ ​ 国内第一本HealthKit专向教程.本教程详细讲解iOS中,如何使用HealthKit框架开发健康应用.最后,本教程结合HealthKit ...

  3. Apple Watch开发快速入门教程

     Apple Watch开发快速入门教程  试读下载地址:http://pan.baidu.com/s/1eQ8JdR0 介绍:苹果为Watch提供全新的开发框架WatchKit.本教程是国内第一本A ...

  4. 指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程

    指示灯组与3个复位按钮的介绍Arduino Yun快速入门教程 ​1.4.2  指示灯组 指示灯组的放大图如图1.5所示. 图1.5  指示灯组 各个指示灯对应的功能如下: q  RX:对应于0号端口 ...

  5. 游戏控制杆OUYA游戏开发快速入门教程

    游戏控制杆OUYA游戏开发快速入门教程 1.2.2  游戏控制杆 游戏控制杆各个角度的视图,如图1-4所示,它的硬件规格是本文选自OUYA游戏开发快速入门教程大学霸: 图1-4  游戏控制杆各个角度的 ...

  6. Arduino Yun的主要部件介绍选自Arduino Yun快速入门教程

    Arduino Yun的主要部件介绍 1.4.1  主要部件 Yun的主要部件如图1.4所示. 图1.4  Arduino Yun的主要部件 在Yun小小的板子上集成了两颗处理器.一个是ATmega3 ...

  7. 认识AndEngine选自Android 2D游戏引擎AndEngine快速入门教程

    认识AndEngine什么是AndEngine 随着Android手机.平板的盛行,Android下的游戏也不断的变得火热.而对于游戏开发有兴趣的同学们,应该也想要学习开发游戏.虽说游戏开发的引擎较多 ...

  8. OUYA游戏开发快速入门教程1.2OUYA的硬件规格

    OUYA游戏开发快速入门教程1.2OUYA的硬件规格 从官网上购买回来的OUYA产品,包含游戏主机.游戏控制杆.说明书.电源线.HDMI线.电源线和电池,如图1-2所示.本节就来简要介绍下,游戏主机和 ...

  9. Android 2D游戏引擎AndEngine快速入门教程

    Android 2D游戏引擎AndEngine快速入门教程 介绍:AndEngine是一款知名的Android 2D游戏引擎.该引擎代码开源,并且可以免费使用.本书详细讲解如何使用AndEngine引 ...

最新文章

  1. 编写MapReduce程序,统计每个买家收藏商品数量,实现统计排序功能
  2. 广西师范大学c语言期末试题,广西师范大学 据库原理(A卷).doc
  3. 量子计算机到底神在哪里说明文,“九章”量子计算机到底有多神!
  4. mysql utf8mb4 java_mysql中utf8和utf8mb4区别
  5. 关于ArcGIS JS API中的map高度为400px的问题解决
  6. Myeclipse的使用方法-添加,修改,删除JRE,修改项目中的jre不显示问题
  7. 谢瑛姿(帮别人名字作诗)
  8. ssh-keygen -t rsa执行后提示没有权限
  9. (译)C++11中的Move语义和右值引用
  10. 软件测试验收报告知识点
  11. php开心农场 源码,开心农场源码(UCHome)PHP版下载
  12. Android静默安装实现方案,仿360手机助手秒装和智能安装功能
  13. SitePoint播客#128:我最不喜欢的10岁
  14. web前端面试题-1
  15. jupyter 使用nginx进行代理的nginx配置文件
  16. Siki学院换装项目的MVC实现
  17. COOC+VOSviewer可取代任何文献计量与知识图谱软件
  18. 如何沿法线方向挤出面
  19. 贸易大时代:代理IP助力企业出海
  20. ERP与MES的区别与联系

热门文章

  1. 荣耀畅玩5A近期要有大动作,说出旅游梦想就能榜你实现
  2. 设计模式-可复用面向对象软件的基础
  3. 2023年网络文化经营许可证(文网文)办理流程
  4. 浅谈金融数据中心的测试验证工作
  5. 闪存、内存涨价贡献大:美光2017财年第二季度营收暴涨58%
  6. 大数据发力 LTE端到端KPI指标可精细优化
  7. 单片机双字节数乘法运算实验_基于单片机指纹电子密码锁——硬件设计2
  8. 后端Java一年经验面经--其他篇
  9. ringbuffer java例子_使用Ring Buffer构建高性能的文件写入程序
  10. ASEMI肖特基二极管1N5819参数,1N5819代换,1N5819货源