由于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. PostgreSQL 10.0 preview 功能增强

    https://yq.aliyun.com/users/1384833841157402?spm=5176.100239.blogrightarea51131.3.yI7e9d

  2. 如何在SQLite中创建自增字段

      SQLite 简单的回答:一个声明为 INTEGER PRIMARY KEY 的字段将自动增加. 这里是详细的答案: 从 SQLite 的 2.3.4 版本开始,如果你将一个表中的一个字段声明为 ...

  3. JavDroider的作品展示

    好久没有写博客了,很懊悔,尽管说实习和项目那边的任务有点多,可是我想每天抽出时间出来写一篇文章总结一下当天所习所得并不困难! 好了,今天以一篇个人作品介绍来又一次开启我的博客~ 实习单位的门户站点 一 ...

  4. 如何选择Haproxy和Nginx

    对于做软负载,我们都知道主流的方案有LVS.Haproxy.Nginx!那么对于Haproxy和Nginx,我们如何选择呢?回答这个问题之前,我根据个人使用经验来讲下它们的特点! Haproxy特点 ...

  5. Python 可视化Twitter中指定话题中Tweet的词汇频率

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-8 @author: guaguastd @name: pl ...

  6. Python & Django & Pycharm 安装

    一.下载安装Python 从https://www.python.org/上下载 Python 2.7.6,双击安装包开始安装: 单击“Next”按钮,进入Python安装组件选择界面.这里我们安装全 ...

  7. POJ 题目3264 Balanced Lineup(RMQ)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 39046   Accepted: 18291 ...

  8. 面向对象在JavaScript中的接口实现

    接口是面向对象编程的基础.它是一组包括了函数型方法的数据结构,与类一样.都是编程语言中比較抽象的概念.比方生活中的接口.机顶盒.人们利用它来实现收看不同频道和信号的节目,它宛如对不同类型的信息进行集合 ...

  9. memcpy( )的使用以及迭代器的使用

    memcpy() -- 拷贝内存内容 相关函数: bcopy(), memccpy(), memmove(), strcpy(), strncpy() 表头文件: #include <strin ...

  10. web安全系列(一):XSS 攻击基础及原理

    跨站脚本攻击(XSS)是客户端脚本安全的头号大敌.本文章深入探讨 XSS 攻击原理,下一章(XSS 攻击进阶)将深入讨论 XSS 进阶攻击方式. 本系列将持续更新. XSS 简介 XSS(Cross ...