【C#】WixToolset快速入门教程 深碍√TFBOYSˉ_ 2022-05-08 11:26 717阅读 0赞 转载自:[https://blog.csdn.net/catshitone/article/details/77802365][https_blog.csdn.net_catshitone_article_details_77802365] # 介绍 # 给windows系统做软件,常见的打包工具大家可能都听说过,如:大名鼎鼎的Installshield、Inno setup等。在遇见Wix之前InstallShield时我的主力打包工具,操作简单方便项目使用到的dll文件会自动添加,多语言支持也很好,不过不好的是免费版的功能就那几样,越来越无法满足自己的要求。后来就尝试了下Inno setup,这个是用脚本进行配置并生成安装包的,简单尝试之后发现实在麻烦还不好配置,于是就放弃了。再后来就遇到了WixToolSet,这个瑞士军刀一样的打包工具还是免费开源的,已经与VS整合到了一起,安装界面还可以根据WPF一样的xaml标签自定义样式,很是不错,但是国内教程较少而且有些说的也不是很清楚,学起来比较有难度。 之前的老项目升级了,打包时发现wix的打包流程又忘记了,所以这篇教程给自己提个醒,也就给大家带来了一个简单的快速入门教程。 # 要求 # 一个winform做的程序: 1. 可以自定义安装位置 2. 升级包可覆盖安装,不允许降级安装 3. 桌面和开始菜单有启动/卸载的快捷方式 4. 支持中文 # 开始 # ## 1.wix安装方法简单提一下: ## 去[Wix官网][Wix]下载wix的安装包,然后进行安装。完了之后打开vs2017(vs2015)的扩展和更新,搜索【wix】,搜索到之后下载安装,然后重启vs即可。 ## 2.新建wix项目 ## ![这里写图片描述][SouthEast] 如图,选择v3类型的项目,不然本文接下来的代码可能不能用。 ## 3.项目结构 ## 具体结构简介,参考[Wix 安装部署(一)同MSBuild 自动生成打包文件][Wix _MSBuild] 这里不再赘述。 我的项目结构: ![这里写图片描述][SouthEast 1] 其中Product.wxs文件中有个Product节点: ![这里写图片描述][SouthEast 2] 这个节点里有三个属性比较重要,涉及到了上面要求中的软件升级部分。分别是: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> * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 * 11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 * 21 * 22 * 23 * 24 * 25 * 26 * 27 * 28 * 29 * 30 * 31 * 32 * 33 * 34 * 35 * 36 * 37 * 38 * 39 * 40 * 41 * 42 * 43 * 44 * 45 * 46 * 47 * 48 * 49 * 50 * 51 * 52 * 53 * 54 * 55 * 56 * 57 * 58 * 59 * 60 * 61 * 62 * 63 * 64 * 65 * 66 * 67 * 68 * 69 * 70 * 71 * 72 * 73 * 74 * 75 * 76 * 77 * 78 * 79 * 80 * 81 * 82 * 83 * 84 * 85 * 86 * 87 * 88 * 89 * 90 * 91 * 92 * 93 这个配置文件不是很难懂,大部分都可参考[Wix 安装部署(一)同MSBuild 自动生成打包文件][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。如要制作其他的语言包,请自行参考官方文档。 右键你的项目–属性: ![这里写图片描述][SouthEast 3] ## 5.展示 ## ![这里写图片描述][SouthEast 4] ![这里写图片描述][SouthEast 5] ![这里写图片描述][SouthEast 6] -------------------- 重要提示:在编写你的Product.wxs配置文件过程中一定要记得把bin文件下的所有dll、.config、.manifest等重要的文件配置进去,否则会有问题。 参考: [随笔分类 -Wix][-Wix] [WiX Toolset Manual Table of Contents][] [https_blog.csdn.net_catshitone_article_details_77802365]: https://blog.csdn.net/catshitone/article/details/77802365 [Wix]: http://wixtoolset.org/ [SouthEast]: /images/20220508/3b9a74d381084a0a8cbfe677f578ebfc.png [Wix _MSBuild]: http://www.cnblogs.com/stoneniqiu/p/3355086.html [SouthEast 1]: /images/20220508/cb1bba64317c4102847266e232180de9.png [SouthEast 2]: /images/20220508/9525fa3580fe404c805655b4a787652c.png [SouthEast 3]: /images/20220508/f07c01b774384f2b9961db96b93ba818.png [SouthEast 4]: /images/20220508/2be58396f8684cc29fff0a94ee865efd.png [SouthEast 5]: /images/20220508/d9a6c4bb26fe4a3d8c6d996cbbd92da0.png [SouthEast 6]: /images/20220508/ce317a31331440d7a0ebebca96eaa1ad.png [-Wix]: http://www.cnblogs.com/stoneniqiu/category/522235.html%20%E9%9A%8F%E7%AC%94%E5%88%86%E7%B1%BB%20-Wix [WiX Toolset Manual Table of Contents]: http://wixtoolset.org/documentation/manual/v3/
相关 thymeleaf快速入门教程 thymeleaf教程 本教程涵盖了常见的前端操作,比如,判断,循环,引入模板,常用函数(日期格式化,字符串操作)下拉,js和css中使用,基本可以应对一般场景。 怎 梦里梦外;/ 2024年02月18日 20:15/ 0 赞/ 90 阅读
相关 Velocity快速入门教程 1. 变量 (1)变量的定义: \set($name = "hello") 说明:velocity中变量是弱类型的。 当使用\set指令时,括在双引号中的字面字符串将解 深藏阁楼爱情的钟/ 2023年10月17日 15:19/ 0 赞/ 202 阅读
相关 SpringBoot快速入门教程 免费视频教程地址:[https://ke.qq.com/course/3025961?taid=10404511032945705&tuin=a3e3fb1][https_ke 柔光的暖阳◎/ 2022年12月08日 05:27/ 0 赞/ 327 阅读
相关 Hudi入门 快速教程 在深入研究Hudi机制之前,让我们首先了解Hudi正在解决的问题。 客户在使用数据湖时通常会问一个问题:当源记录被更新时,如何更新数据湖?这是一个很难解决的问题,因为一旦你写 朴灿烈づ我的快乐病毒、/ 2022年09月04日 00:48/ 0 赞/ 638 阅读
相关 OpenCL快速入门教程 目录[(?)][Link 1][\[-\]][Link 1] 1. [设备Device][Device] 1. [Kernel][] 2. [主机Ho ﹏ヽ暗。殇╰゛Y/ 2022年07月31日 16:30/ 0 赞/ 396 阅读
相关 SQLite快速入门教程 这个SQLite快速入门教程教你如何有效地开始学习并使用SQLite。通过本教程的实践操作学习之后,相信你应该可以了解并能够熟练地使用SQLite了。 如果您一直在使用其他关 忘是亡心i/ 2022年06月15日 12:20/ 0 赞/ 596 阅读
相关 【Docker入门】快速入门教程 引言 最近在学习Docker,Docker自2013年以来非常火热,无论是从 github 上的代码活跃度,还是Redhat在RHEL6.5中集成对Docker的 布满荆棘的人生/ 2022年06月14日 11:10/ 0 赞/ 439 阅读
相关 thymeleaf快速入门教程 thymeleaf教程 本教程涵盖了常见的前端操作,比如,判断,循环,引入模板,常用函数(日期格式化,字符串操作)下拉,js和css中使用,基本可以应对一般场景。 怎 谁践踏了优雅/ 2022年06月12日 09:55/ 0 赞/ 358 阅读
相关 GraphQL快速入门教程 摘要: 体验神奇的GraphQL! 原文:[GraphQL 入门详解][GraphQL] 作者:MudOnTire [Fundebug][]经授权转载,版权归原 ╰+攻爆jí腚メ/ 2021年11月16日 18:32/ 0 赞/ 732 阅读