前段时间整理5篇WIX(Windows Installer XML)的安装教程,但还不够完善,这里继续整理了七个知识点分享给大家。WIX最新版本3.8,点击下载

1.设置路径变量

有的时候路径过长,文件又比较多,重复粘贴一个地址总是不舒服,而且要改起来也很麻烦,那这个时候就可以用统一的变量了。

项目右键-->属性-->Build-->Define Preprocessor variables:  直接 vars=address; 分号隔开就可以了。

使用的时候用$(var.yourvars)就可以了

  1. <!--自定义页面元素-->
  2. <WixVariable Id="WixUIDialogBmp" Value="$(var.Photoes)bk.jpg"/>
  3. <WixVariable Id="WixUIBannerBmp" Value="$(var.Photoes)top.jpg"/>

而上图中的Define variables是预先定义Property(在WIX中,Property就是代表变量),

其实元素Directory也是一种Property。也已经为我们定义了目录。可以直接用。

比如讲你的数据文件安装在C:\ProgramData文件中(对应CommonAppDataFolder)

  1. <Directory Id="CommonAppDataFolder">
  2. <Directory Id="MyDATA" Name="DATA">
  3. <Directory Id="DemoProject" Name="DemoProject" />
  4. </Directory>
  5. </Directory>

而Culture to build是用于生成不同语言的安装包不同语言分号隔开。

生成对应版本。

2.注册COM组件

这个问题困扰我好久,一开始用Action触发bat文件注册,但有个cmd框,有网友提议用QtExecCmdLine静默注册,但没有实现。自己写注册表一个是工作量蛮大,二个是写不对(regedit中一大堆)。最后网友提示File标签支持自己注册。我就呵呵~

  1. <DirectoryRef Id="IORegedit">
  2. <Component Id="ForIOSERVER" Guid="{B5F03CF3-BBAE-4C03-BA06-4FE211FF41FD}">
  3. <File Id="CxDrvOPC.dll" Source="$(var.Runtime)IORegedit\CxDrvOPC.dll" SelfRegCost="1" />
  4. <File Id="CxDrvModbus.dll" Source="$(var.Runtime)IORegedit\CxDrvModbus.dll" SelfRegCost="1" />
  5. </Component>
  6. </DirectoryRef>

SelfRegCost>0就可以自动注册,但文档里面描述的又比较晦涩,注册这个文件所需的Bytes?

3.开机自启动

安装之后,希望程序开机启动。同C#程序一样,需要将程序注册到SOFTWARE\Microsoft\Windows\CurrentVersion\Run 目录下即可。

  1. <Component Id="Register">
  2. <RegistryKey Action="create" Id="AutoStarKey" Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Run">
  3. <RegistryValue Id="autoStarKeyValue" Name="!(loc.AppName)" KeyPath="yes" Type="string" Value="[INSTALLFOLDER]HMIRun.exe" />
  4. </RegistryKey>
  5. </Component>

如果是C#程序

  1. private void AutoRun()
  2. {
  3. //获取程序执行路径..
  4. string starupPath = Application.ExecutablePath;
  5. //表示Window注册表中项级节点,读取 Windows 注册表基项HKEY_LOCAL_MACHINE
  6. RegistryKey loca = Registry.LocalMachine;
  7. RegistryKey run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
  8. if (run != null) run.SetValue("YourApp", starupPath);//加入注册,参数一为注册节点名称(随意)
  9. }

这里要说明的是Root="HKLM"

Type=“String”

4.删除日志文件

打包程序不处理的话,程序卸载之后可能会留下日志文件和一些数据文件,默认只会卸载安装时的那些文件,新增的文件不会删除。

这时要用RemoveFile和RemoveFolder两个元素

  1. <DirectoryRef Id="History" >
  2. <Component Id="ForHistory" Guid="5628C681-0345-4BFC-2345-4C4D446401CE" KeyPath="yes">
  3. <File Source="$(var.DemoProject)History\HistoryDB201402.sdf" />
  4. <File Source="$(var.DemoProject)History\HistoryDB201403.sdf"/>
  5. <File Source="$(var.DemoProject)History\HistoryDB201404.sdf"/>
  6. <RemoveFile Id="removeDb" Name="*.sdf" On="uninstall" Directory="History"/>
  7. <RemoveFolder Id= "Rdb1" Directory="History" On= "uninstall"/>
  8. </Component>
  9. </DirectoryRef>

要注意的是,如果History目录上面还有父目录,也需要加入RemoveFolder将父目录清除。

5.用Orca.exe 查看安装包

生成的MSI文件,其实就是一个数据库。不同的元素就是不同的表格,我们可以借助Orca.exe来查看,可以用来纠错和直接修改。点击下载

我们看到Property表,可以看到已经有很多自带的Property,而且数据是可以编辑的。 有的时候就可以直接修改不必再去生成。

6.版本更新

WIX定义了三个级别的更新,以版本信息和产品GUID号是否改变来判断。

  1. <Product Id="{092B357C-6028-42CF-BCE0-44B717628935}" Name="!(loc.ProjectName)" Language="1033" Version="1.1.1.0" Manufacturer="yourCompany" UpgradeCode="{BA90B701-DB4C-4FF2-9717-88EBA32060D7}">
  2. ....
  3. </Product>

产品ID改变表示这个版本这次是改动很大,Version的前两位可能都改变了(Windows只检查前三位),而UpgradeCode不能变,变了那真就是表示是另外一个产品了。UpgradeCode 在判断版本的时候的有用。比如直接更新版本和防止版本降级。Upgrade的Id就是上面的UpgradeCode

  1. <!--新旧版本检查-->
  2. <Upgrade Id="{BA90B701-DB4C-4FF2-9717-88EBA32060D7}">
  3. <UpgradeVersion Property="OLD_VERSION_FOUND" OnlyDetect="no" IgnoreRemoveFailure="yes" MigrateFeatures="yes" Language="1033"
  4. Minimum="1.0.0.0" Maximum="2.0.0.0" IncludeMinimum="yes" IncludeMaximum="no" />
  5. <UpgradeVersion Property="NEWER_VERSION_FOUND" Minimum="2.0.0.0" IncludeMinimum="no" OnlyDetect="yes" Language="1033" />
  6. </Upgrade>

其实比较麻烦的是Minor Upgrade 和 Small Upgrade。他们的做法一样,相当于给我们的程序打补丁。需要4步

1.在你的WIX工程中先创建一个Patch.WXS文件。Media的Cabinet表示后面要用到的CBA文件的名称,Id越大越好,要高于你MSI文件中要更新的Media的Id,PatchBaseLine的Id会作为后面的一个引用(遗憾的是,我还没有找到为什么...) 而PatchFamily就比较直白了,更新的版本,对应的ProductCode(Product的Id),里面ComponentRef 表示那些组件发生了变化。其他就不用说明了

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  3. <Patch AllowRemoval="yes" Classification="update" Comments="Patch for Your Software v. 1.1.0.0"
  4. Description="Updates Software to v. 1.1.0.0" DisplayName="Your Software Patch 2014-05-22"
  5. Manufacturer="YourCompany" MoreInfoURL="http://www.xxx.com/" TargetProductName="YourProduct">
  6. <Media Id="1000" Cabinet="MyPatch.cab">
  7. <PatchBaseline Id="MyPatch" />
  8. </Media>
  9. <PatchFamily Id="MyPatch" Version="1.1.1.0" ProductCode="{092B357C-6028-42CF-BCE0-44B717628935}" Supersede="yes">
  10. <ComponentRef Id="ForHMIRT"/>
  11. </PatchFamily>
  12. </Patch>
  13. </Wix>

不要包括在你的项目,右键从项目中解除。

2.用candle.exe 生成wixobj 文件。

最好先把Wix目录,添加到你的环境变量。我的电脑右键--属性--高级系统设置--环境变量:编辑Path 分号隔开,加上%Wix%

然后就可以直接调用candle.exe

再用light.exe 生成wixmsp

3.再把你更新版本的pdb文件和当前工程的pdb文件复制到Patch.wxs同一个目录。 调用命令生成wixmst文件,做这些主要是要比较两个版本的差异。当然前提是你现在的工程已经新增了组件或者组件里面已经新增了文件,并生成了一次。

  1. torch.exe -p -xi older.wixpdb newpdb.wixpdb -out Patch.wixmst

4.最后生成一个MSP文件

同上,调用Pyro.exe.

  1. pyro.exe Patch.wixmsp -t MyPatch Patch.wixmst -out Patch.msp

生成的MSP文件很小,但安装效果和MSI文件一样。和你更新组件的多少有关系。整个过程有点繁杂,而且不清晰。最简单的办法还是改变版本号和ProductCode 重新发布一个版本。上面用到了很多exe,这些都是wix自带的工具。各自有不同的功能

7.用Heat.exe自动生成wxs文件

我们要打包一个工程,但文件项目非常多,要是一个一个敲xml标签确实有点苦逼,其实WIX已经提供了heat.exe这个神奇来解决这个问题了。在D盘新建一个Runtime文件,随便拖一些文件进去。打开Cmd调用命令

dir表示目录,-out 表示输出  瞬间就生成了HeatFile.Wxs. 但一看,不是我们想要的,GuiD没有生成,Component的Id也不直观。 不急有更强大的命令

再看WXS文件,命令中的dr表示建立目录,cg 是建立ComponentGroup -var是创建变量,-gg表示自动生成GUID  -gl表示GUID不带括号,其他命令可以通过heat.exe -?来查看

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  3. <Fragment>
  4. <DirectoryRef Id="RunTime">
  5. <Directory Id="dirD818D8F32371FA9E971748891D2F242F" Name="zh-CHS" />
  6. </DirectoryRef>
  7. </Fragment>
  8. <Fragment>
  9. <ComponentGroup Id="MyFileGroup">
  10. <Component Id="cmpFA55E9F45A78DE86628F8BCAF841C59C" Directory="RunTime" Guid="{14872EC8-B1A0-4DC9-84D5-E9F809D82230}">
  11. <File Id="filA7DF3B9FB3655FA11EA18E662641CEBA" KeyPath="yes" Source="$(var.Dir)\HMIRun.exe.config" />
  12. </Component>
  13. <Component Id="cmp3F203958186210FBCF0D3406F15BEA8A" Directory="RunTime" Guid="{0249740B-AF5F-498B-9F5E-E5780DA84412}">
  14. <File Id="fil55A2858BF646C17534199602D317C722" KeyPath="yes" Source="$(var.Dir)\NLog.config" />
  15. </Component>
  16. <Component Id="cmp6E035C559882EEC7EF1A85BECD96EC39" Directory="RunTime" Guid="{E2F60E84-02AB-41ED-A3BF-88C3CEB34DAD}">
  17. <File Id="fil407F115AC10BEC92A22BDC17267AEC7B" KeyPath="yes" Source="$(var.Dir)\TemplateProject.template" />
  18. </Component>
  19. <Component Id="cmp077331F5CBD00FD180CA24C8FFF612A0" Directory="dirD818D8F32371FA9E971748891D2F242F" Guid="{581B54CC-0E55-4374-9CC8-F5D8784A23B6}">
  20. <File Id="filD5FE549C3B37047CA548D43FDBBFD3A0" KeyPath="yes" Source="$(var.Dir)\zh-CHS\System.Data.SqlServerCe.Entity.resources.dll" />
  21. </Component>
  22. <Component Id="cmp857576E8B47F065DAA1F65C9021B5B23" Directory="dirD818D8F32371FA9E971748891D2F242F" Guid="{50B28B73-4648-4582-BF13-D517224C3617}">
  23. <File Id="filB140B4B368F3FC0584CDDCA845EDC878" KeyPath="yes" Source="$(var.Dir)\zh-CHS\System.Data.SqlServerCe.resources.dll" />
  24. </Component>
  25. </ComponentGroup>
  26. </Fragment>
  27. </Wix>

这样生成的文件就很漂亮了,可以复制你的工程中去。

今天先到这里,希望对你有帮助~

tks!:)

WIX 安装部署教程(六) 为你收集的七个知识点的更多相关文章

  1. Wix 安装部署教程(九) --用WPF做安装界面

    经常安装PC端的应用,特别是重装系统之后,大致分为两类.一类像QQ,搜狗输入法这样的.分三步走的:第一个页面可以自定义安装路径和软件许可.第二个页面显示安装进度条,第三个页面推荐其他应用.先不管人家怎 ...

  2. Wix 安装部署教程(十六) -- 自动生成多语言文件

    因为持续集成需要,所有项目编译完之后生成一个多语言的安装包.之前生成mst文件都是手动操作,而且mst文件必须每次重新和新的安装包“关联”,否则中文的安装包去调用英文的资源的时候就会报类似于“类型转换 ...

  3. Wix 安装部署教程(十五) --CustomAction的七种用法

    在WIX中,CustomAction用来在安装过程中执行自定义行为.比如注册.修改文件.触发其他可执行文件等.这一节主要是介绍一下CustomAction的7种用法. 在此之前要了解InstallEx ...

  4. Wix 安装部署教程(四) 添加安装文件及快捷方式

    通过之前三篇的介绍,大家对wix的xml部署方式也应该有一些认识,今天天气不错,再来一发.主要介绍桌面,开始菜单,卸载等功能的如何添加.希望园友们支持! 一.如何添加文件 Demo打包程序很简单,就一 ...

  5. Wix 安装部署教程(三)自定义安装界面和行为

    接上一篇自定义安装界面,这篇继续探索,首先介绍下,Wix为我们定义了五种风格,每种风格的UI都是有一定顺序的.我们可以改变安装顺序,也可以完全自定义一个Dialog插入其中.比如Wix_Mondo 风 ...

  6. Wix 安装部署教程 -CustomAction的七种用法

    在WIX中,CustomAction用来在安装过程中执行自定义行为.比如注册.修改文件.触发其他可执行文件等.这一节主要是介绍一下CustomAction的7种用法. 在此之前要了解InstallEx ...

  7. Wix 安装部署教程(十三) -- 多语言安装包

    这几天摸索WIX的多语言安装包(这里是Wix的setup 工程,不是Bundle),终于走通了,感谢网友uni的指点.WIX的多语言安装包能够根据系统环境自动切换界面语言,你也可以通过命令指定语言.下 ...

  8. Wix 安装部署教程(十二) -- 自动更新WXS文件

    上一篇分享了一个QuickWIX,用来对比两个工程前后的差异,但是这样还是很繁琐,而且昨天发现有Bug,目录对比有问题.这次改变做法,完全让程序自动去更新WXS文件,然后再用CCNet去自动编译,这样 ...

  9. Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面

    在上一篇中曾留下两个问题,.Net捆绑安装不触发以及路径选择的问题现在都已经解决,这段时间花的最多的地方还是WPF调样式上面,奈何WPF功力不够,暂时还是没有达到自己想要的效果.另外ViewModel ...

随机推荐

  1. 常见sizeof 笔试题

    最近面试过程中遇到了很多很多sizeof的问题. 现在总结一下: #include <stdio.h> #include <string.h> void fun(int arr ...

  2. android 很多牛叉布局github地址(转)

    原文地址 http://blog.csdn.net/luo15309823081/article/details/41449929 点击可到达github-------https://github.c ...

  3. phantomjs和angular-seo-server实现angular单页面seo

    1.下载phantomjs,并配置环境变量为   eg:E:\phantomjs-2.1.1-windows\bin 2.下载angular-seo-server 3.windows下:cmd eg: ...

  4. 用datagrid实现完整的一个页面

    打怪升级真的好难,记录一点一滴,一滴一点,先上效果图. 1.想完成一个界面,先得有界面.界面是在WebRoot下的根目录文件中新建的zjqktj.jsp中建立的,再通过java在后台调用数据库取出数据 ...

  5. 深入研究C语言 第四篇

    这里更多探究的是指针的机制. 用debug对下面程序进行分析,记录每一条C语句运行后,相关内存单元的值. 程序a.c 注意理解指针机制 我们编写如下代码: 编译加载进debug查看: 我们先看其反汇编 ...

  6. 使用Concurrency Visualizer优化性能

    Concurrency Visualizer: https://msdn.microsoft.com/en-us/library/dd537632.aspx?f=255&MSPPError=- ...

  7. JavaScript拼接字符串传递多个参数

    var ftOpreat = function (value,rows){ var v = rows.Version; var preview = "<a href=\"#\ ...

  8. 查询目前运行状态-CPU等情况

    对目前的数据库的运行状况有一个基本的了解 ) DB_NAME(a.dbid) AS dbname , loginame , spid , cpu , b.text , lastwaittype , w ...

  9. 上传App Store成功后,无法构建版本解决方法

    最近iOS10出来了,Xcode也跟着升级到了8,想着App做个更新,于是修改好了代码打算上传新包,无奈总是发现构建不了新版本.这种情况是因为苹果更重视用户的隐私,知道原因就能想到对策了,就是在pli ...

  10. 树型dp

    树形dp主要有两种,比较重要的共同点就是要想全所有情况. [一] 第一种是简单的父子关系型,即动规只与一个节点和它的子节点有关. [例]codevs1380没有上司的舞会: 有个公司要举行一场晚会.为 ...