由于Windows Installer不是平台独立的(即区分32-bit和64-bit),因此用Wix制作的安装包在编译不能像.net应用那样采用Any CPU编译,而必须制定是目标Platform是x86还是x64。这决定了我们的程序必须针对32-bit和64-bit的操纵系统提供两个不同的版本的安装包,一个32位的,一个64位的。如果业务上允许提供两个安装包,那没问题。我这里要说的是如何制作一个安装包可以同时安装在两种平台上。

3.6版开始,Wix引入了一个新的功能-“the Burn bootstrapper/chaining engine”。Burn的主要功能是将多个安装包打包到一起,实现一键安装。这些安装包可以是我们的应用程序安装包,也可以是一些运行时的支持库,比如.Net Framework, C++ runtime之类,或者是像数据库、IIS之类的应用。

那么利用Burn我们可以32位和64位的两个安装打包到一起形成一个安装包。关于如何打包的详细说明请参考“http://wixtoolset.org/documentation/manual/v3/bundle/”,我这里只是结合一个简单的例子来分享一些实际使用过程中遇到的问题和解决方案。

步骤1:添加一个Bootstrapper Project。

Bootstrapper从字面理解就是一个启动器,而实际上它就是Wix的Burn功能。假定我们已经有了两个安装包,接下来就是:

步骤2:添加对安装包项目的引用。

安装项目的引用能方便我们在步骤3中引用安装包的输出文件路径。

步骤3:打开Bundle.wxs文件添加安装包文件的引用

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Bundle Name="WixBootstrapperExample" Version="1.0.0.0" Manufacturer="Rader" UpgradeCode="1c99d366-abd8-4946-9573-b01a9188301b" >
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />

<Chain>
      <!-- TODO: Define the list of chained packages. -->
      <MsiPackage SourceFile="$(var.Setup_x86.TargetPath)"  Vital="yes" />
      <MsiPackage SourceFile="$(var.Setup_x64.TargetPath)"  Vital="yes" />
    </Chain>
  </Bundle>
</Wix>

步骤4:添加安装条件,控制32位、64位安装包的执行

Burn在执行一个安装包(Msi)之前会先检查安装条件(InstallCondition),如果条件不满足就不会执行。针对本例我们可以将执行条件设定为32位OS或64位OS上才执行,具体如下:

<MsiPackage SourceFile="$(var.Setup_x86.TargetPath)"  Vital="yes" DisplayInternalUI="yes" Visible="yes" Compressed="no" InstallCondition="NOT VersionNT64" />
     <MsiPackage SourceFile="$(var.Setup_x64.TargetPath)"  Vital="yes" DisplayInternalUI="yes" Visible="yes" Compressed="no" InstallCondition="VersionNT64" />

“VersionNT64”是Burn的内置变量,当Bootstrapper安装程序在64位机器上执行的时候该值会被设定为真。

PS:

完整的Bootstrapper项目的代码:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Bundle Name="WixBootstrapperExample" Version="1.0.0.0" Manufacturer="Rader" UpgradeCode="1c99d366-abd8-4946-9573-b01a9188301b"
          DisableRemove="yes" DisableModify="yes" DisableRepair="yes">
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense" />

<Chain>
      <!-- TODO: Define the list of chained packages. -->
      <MsiPackage SourceFile="$(var.Setup_x86.TargetPath)"  Vital="yes" DisplayInternalUI="yes" Visible="yes" Compressed="no" InstallCondition="NOT VersionNT64" />
      <MsiPackage SourceFile="$(var.Setup_x64.TargetPath)"  Vital="yes" DisplayInternalUI="yes" Visible="yes" Compressed="no" InstallCondition="VersionNT64" />
    </Chain>
  </Bundle>
</Wix>

相关代码在Win7(64-bit)/WindowsServer2003(32-bit) +VS2013+Wix 3.8下测试通过。

Wix Burn:如何将32位和64位的安装包制作成一个安装包的更多相关文章

  1. 64位主机64位oracle下装32位客户端ODAC(NFPACS版)

    64位主机64位oracle下装32位客户端ODAC(NFPACS版) by dd 1.下载Oracle Data Access Components(ODAC) Xcopy的两个版本: x86:(我 ...

  2. Linux系统查看系统是32位还是64位方法总结

    这篇博客是总结.归纳查看Linux系统是32位还是64位的一些方法,很多内容来自网上网友的博客.本篇只是整理.梳理这方面的知识,方便自己忘记的时候随时查看. 方法1:getconf LONG_BIT ...

  3. oracle 32位导64位

    oracle 32位导64位 SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER SYSTEM ENABLE RESTRICTED SESSION; ; ; ALTER ...

  4. Shell脚本中,如何判断Linux系统是32位还是64位?

    一行就能搞定,输出32或者64 可以用“和. 参考代码如下: ldconfig if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LON ...

  5. 【转】Tomcat版本是32位、64位问题

    转载地址:http://www.cnblogs.com/greensleeves/p/3168541.html 最近遇到一个Tomcat windows安装版本是32位还是64位问题.由于一系列原因, ...

  6. 查看Linux是32位还是64位

    最直接简洁的办法: 在linux终端输入getconf LONG_BIT命令 如果是32位机器,则结果为32 [root@localhost ~]# getconf LONG_BIT 32 如果是64 ...

  7. Windows2003 IIS6.0支持32位和64位两种模式的设置方法

    IIS 6.0 可支持 32 位和 64 位两种模式.但是,IIS 6.0 不支持在 64 位版本的 Windows 上同时运行这两种模式.ASP.NET 1.1 只在 32 位模式下运行.而 ASP ...

  8. linux-查看系统是32位还是64位

    可以用命令“getconf LONG_BIT”查看, 如果返回的结果是32则说明是32位,返回的结果是64则说明是64位. 此外还可以使用命令“uname -a”查看, 输出的结果中,如果有x86_6 ...

  9. 查看linux机器是32位还是64位的方法

    file /sbin/init 或者 file /bin/ls/sbin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dyna ...

随机推荐

  1. IE6~IE7 bugs

    本来想写一篇关于 IE bugs 的总结的,但是发现 IE 的 bugs 一般都存在IE5,IE6,IE7上,这都是很古老的浏览器.而且这些 bugs 测试起来相当麻烦,IEtester和 IE10 ...

  2. POJ 1067 取石子游戏 [博弈]

    题意:威佐夫博弈. 思路:看了很多证明都没看懂.最后决定就记住结论好了. 对于所有的奇异局面(必败局),有通项公式 Pi = (a, b), (a = i * [(sqrt(5) + 1) / 2], ...

  3. Spring MVC通过Pageable对象和PageableDefault注解获取分页信息(MongoDB通过Pageable来操作分页)

    说明:Pageable同时也能用于操作MongoDB的分页. PageableSpring Data库中定义的一个接口,该接口是所有分页相关信息的一个抽象,通过该接口,我们可以得到和分页相关所有信息( ...

  4. sslstrip 中间人HTTP

    https://moxie.org/software.html http://bbs.pediy.com/thread-173970.htm https://www.cnblogs.com/index ...

  5. zabbix监控系统-部署规划

  6. 测试整合之王Unitils

    16.4.1  Unitils概述(1) Unitils测试框架目的是让单元测试变得更加容易和可维护.Unitils构建在DbUnit与EasyMock项目之上并与JUnit和TestNG相结合.支持 ...

  7. UNP学习笔记(第十八章 路由套接字)

    路由套接字上支持3种类型的操作 1). 进程能通过写路由套接字向内核发消息. 2). 进程能通过路由套接字从内核读消息. 3). 进程可以用sysctl函数得到路由表或列出所有已配置的接口. 数据链路 ...

  8. SQLite可视化管理工具汇总

    版权声明:本文为博主原创文章,未经博主允许不得转载. 搜集了一些SQLite工具,在这里做个总结,有的工具用的多一些,有的只是简单试用,甚至未试用,所以有描述不当的还请回复指正,也欢迎补充完善! 20 ...

  9. 【Sprint3冲刺之前】TD学生助手——alpha版发布

    TD学生助手——alpha版发布 1.设想和目标  1.我们的软件要解决的问题 TD学生助手的主要核心思想就是帮助学生安排他们忙碌的学校生活.主要是通过以下几个方面 1.通过学生的需要进行分类(考试, ...

  10. 【问】Windows下C++局部变量在内存中的分布问题

    原本是为了看看C++对象模型中子对象赋值给一个父对象和父类型指针指向的域时,到底会不会切割,就打开codebloks写了下面的代码,编译器选的是GNU. #define DEBUG(X) std::c ...