由于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. 我眼中的AI

    !!!!本文禁止转载,引用,仅供观看 最初了解人工智能是在我上大二的时候,在看头条的时候经常看到有关人工智能的事情,当时的我和大多数的人一样,感觉人工智能很神奇.当时就整晚整晚的想人工智能会取代人类呀 ...

  2. linux运维(重点)

    linux 添加系统变量: export log="log-all-$(date +%Y-%m-%d).php" export log="log-all-$(date + ...

  3. asp.net站点从2003服务器迁移到2008服务器出现定义了重复的“system.web.extensions/scripting/scriptResourceHandler”节的问题解决

    解决方法: 1.从4.0降到2.0. 2.直接删除整个节点,如下:

  4. stretchableImageWithLeftCapWidth气泡拉伸

    - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCap ...

  5. ElasticSearch查询max_result_window问题处理

    需要出一份印地语文章的表,导出规则为: 1.所有印地语(包含各种颜色,各种状态)的文章 2.阅读数大于300 3.按照阅读推荐比进行排序,取前3000篇文章 说明: 1.文章信息,和阅读推荐数量在两个 ...

  6. Azkban上传文件报错installation Failed.Error chunking

    azkaban 上传文件报错Caused by: java.sql.SQLException: The size of BLOB/TEXT data inserted in one transacti ...

  7. mysql 远程登陆不上

    当使用 TCP/IP 连接 mysql 时, 出现 : Can't connect to MySQL server on 'xxx.xxx.xxx.xxx.'(111) 这个错误. 经过重复折腾: 确 ...

  8. awstats的安装和配置

    一.Awstats简介Awstats是一个免费非常简洁而且强大有个性的网站日志分析工具.它可以统计您站点的如下信息:一:访问量,访问次数,页面浏览量,点击数,数据流量等二:精确到每月.每日.每小时的数 ...

  9. apue学习笔记(第四章 文件和目录)

    本章将描述文件系统的其他特性和文件的性质. 函数stat.fstat.fstatat和lstat #include <sys/stat.h> int stat(const char *re ...

  10. url删除指定字符

    var str = "http://www.xxx.com/?pn=0"; // 删除指定字符 pn=0 // 我将这个字符串里所可能想到的各种情况都列举出来 var a = [ ...