由于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. 2016集训测试赛(二十四)Problem C: 棋盘控制

    Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\ ...

  2. BZOJ 4011 HNOI2015 落忆枫音

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=4011 题目很长,写得也很有诗意与浪漫色彩,让我们不禁感叹出题人是一个多么英俊潇洒的人. 所 ...

  3. c# datetime是一年中的第几周

    public static int WeekOfYear(DateTime dt, CultureInfo ci) { return ci.Calendar.GetWeekOfYear(dt, ci. ...

  4. Docker 限制容器资源

     默认情况下,容器没有资源的限制,它可以使用整个主机的所有资源.Dcoker提供了控制资源的方法,  多少内存,CPU,IO,都可以在docker run使用标志符来设置.   内存 Docker可以 ...

  5. Android Retrofit使用教程

    Square公司开源了许多优秀的库,Retrofit就是其中之一. Retrofit是用来简化APP访问服务器API,如果你的服务器使用的使RESTAPI,那么赶紧使用Retrofit吧. 官方的文档 ...

  6. Linux下搭建PHP开发环境(LAMP)

    LAMP:Linux+Apache+Mysql/MariaDB+Perl/PHP/Python 一键安装方法如下: 注:Ubuntu下可使用sudo su 命名切换到root用户. 开始安装之前,先执 ...

  7. Android 网络编程 记录

    简单介绍 看了深入理解Android网络编程感觉不错.今天对Android网络编程进行了要点记录. 内容 Android基于网络技术和编程实践 要点 定义 描写叙述 IP协议 用于报文交换网络的一种面 ...

  8. vue.js+koa2项目实战(四)搭建koa2服务端

    搭建koa2服务端 安装两个版本的koa 一.版本安装 1.安装 koa1 npm install koa -g 注:必须安装到全局 2.安装 koa2 npm install koa@2 -g 二. ...

  9. ruby 作为嵌入脚本时使用的注意事项

    近期一直在採坑... 假设是作为嵌入式脚本使用ruby的话... 一定会遇到这2个问题... gem安装的,无法在嵌入时使用..为啥.? 由于你没require 'ruby gem' 出现 找不到 E ...

  10. C语言 指向结构体数组的指针

    当结构体指针变量指向一个结构体变量数组的时候,此时指针变量的值就是结构体数组的首地址 关于如何定义结构体数组,和将结构体指针指向结构体变量数组,不是重点. 重点是,明白结构体指针的是怎么移动的, 我个 ...