原文 利用WIX制作安装包(1)

#installation

下载最新版本的WIX toolset 并安装DOWNLOAD

Wix toolset V3.5之后的版本已经可以集成到visual studio,我们可以直接在vs中编写代码,并借助vs进行编译。

#demo

首先打开 Visual Studio,然后选择创建WIX Setup Project. 创建完成之后的在项目中我们可以看到一个名为Product.wxs的文件,其代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="SetupProject1" Language="1033" Version="1.0.0.0" Manufacturer="" UpgradeCode="8e1efb05-1e12-40e5-abca-c8bd7965bf2a">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<MediaTemplate /> <Feature Id="ProductFeature" Title="SetupProject1" Level="1">
<ComponentGroupRef Id="ProductComponents" />
</Feature>
</Product> <Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="SetupProject1" />
</Directory>
</Directory>
</Fragment> <Fragment>
<ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
<!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. -->
<!-- <Component Id="ProductComponent"> -->
<!-- TODO: Insert files, registry keys, and other resources here. -->
<!-- </Component> -->
</ComponentGroup>
</Fragment>
</Wix>

属性介绍:

 1. UpgradeCode 标签中的 UpgradeCode 是产品的版本id。产品的升级卸载全部要用到它,一旦指定之后就不要修改。
2. product标签中的 id 是该产品当前版本的id。它每次在升级版本的时候都需要改变。
3. Directory 定义产品安装目录的目录结构
4. Feature 产品的功能列表
5. MajorUpgrade 防止产品降级安装。
6. Manufacturer 公司或者组织名称

#file

项目创建完成之后,我们需要往安装包里面添加文件。WIX添加文件的方法很方便,直接使用<File Source="文件路径" /> 就可以把一个文件添加到安装包中来。文件路径 可以用绝对路径和相对路径来表示,在Wix中相对路径的可能需要用到变量。例如:

$(var.ReferencedProjectName.TargetDir) 表示项目中引用的另一项目‘ReferencedProjectName‘的输出路径

$(env.WIXPATH) 表示系统的环境变量WIXPATH所指向的路径。

关于其它的表示方法请大家参阅官网。

在这里我们在项目中添加一个文件夹resource , 并在这个文件夹下添加一个TextFile1.txt,然后在上述代码中的//todo注释的下面添加如下代码

<Component Id="ProductComponent" Guid="7B428173-1277-482B-BC2E-CC008F3B79F9">
<File Source="resource/TextFile1.txt" />
</Component>

然后指定Manufacturer 后就进行编译,编译成功之后进行安装,之后大家在c:/programfiles(X86)/SetupProject1 的目录下就可以看到TextFile1.txt 文件了。就这样一个简单的安装包就制作成功了。 但是这一一个简单的安装包绝对不能满足我们日常的工作需要。下面我将为大家介绍如何实现一些另外的操作

#directory

自定义安装目录结构。修改directory结构目录为如下

<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir"
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLFOLDER" Name="SetupProject1">
<Directory id="LOG" name="log"/>
<Directory id="DATA" name="data"/>
</Directory>
</Directory>
</Directory>
</Fragment>

然后重新编译安装。就会发现安装之后的目录结构已经变成了如下

    -ProgramFiles(x86)
--SetupProject1
---log
---data

#ui

WIX默认为我们提供了五种UI类型。关于每种UI的样式。请大家自己尝试或者查看文档。

  1. WixUI_Advanced Dialog Set
  2. WixUI_FeatureTree Dialog Set
  3. WixUI_Minimal Dialog Set
  4. WixUI_Mondo Dialog Set
  5. WixUI Dialogs

如果我们要引用任一UI,我们只需要在product.wxs 文件中添加如下代码

<UIRef id="WixUI_Advanced"/>
  • 1

然后编译运行,就会看到UI已经发生了改变。如果需要自定义UI则需要重新编写一个UI,然后添加到WixUI_Advanced 的 UI Sequence中去.(请见下一篇)

#action

WIX 允许我们自定义Action。如果需要自定义Custom Action,我们需要另外创建一个类型为C# Custom Action Project的项目。创建成功后,在项目中添加一个CustomAction.cs 然后编辑代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Deployment.WindowsInstaller; namespace CustomAction1
{
public class CustomActions
{
[CustomAction]
public static ActionResult CustomAction1(Session session)
{
session.Log("Begin CustomAction1");
return ActionResult.Success;
}
}
}

这样一个自定义的方法就定义好了。然后编译项目。该项目编译成功之后会有两个输出文件CustomAction.dll 和 CustomAction.CA.dll. 其中以CA.dll 结尾的文件才是我们所需要的文件。 然后我们把CustomAction项目添加到之前创建的项目的引用中去。然后添加文件customAction.wxs 并添加如下代码

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<Binary Id="BINARYFILE" SourceFile="$(var.CustomAction.TargetDir)CustomAction1.CA.dll" />
<CustomAction Id="CustomAction1" BinaryKey="BINARYFILE" DllEntry="CustomAction1" />
</Fragment>
</Wix>

这样一个CustomAction就创建并引入成功了。下面我们就可以调用这个方法了。在WIX中Action的执行时有顺序的。如果我们要添加一个自定义事件,我们必须要指定它在什么事件之前或者之后执行,见如下代码,关于WIX的事件顺序请参考事件顺序

<InstallExecuteSequence>
<Custom Action="CustomAction1" After="InstallFiles"/>
</InstallExecuteSequence>

上述代码指定了在InstallFiles 方法执行完成之后立马执行CustomAction1. 就这样,一个自定义的方法就定义成功,并且被成功调用了。

利用自定义的CustomAction我们可以做一些自定义操作。比如写log文件或者其它。

下一篇我将为大家介绍如何使用WIX制作自定义界面,并且将自定义界面添加到UI序列中去

利用WIX制作安装包(1)的更多相关文章

  1. 利用WIX制作安装包(3)

    原文 利用WIX制作安装包(3) 利用WIX安装服务非常简单.只需要短短几句话就可以.当我们创建好一个Windows服务之后.我们在项目中创建一个Service.wxs 文件来安装服务,并且编辑代码如 ...

  2. 利用WIX制作安装包(2)

    原文 利用WIX制作安装包(2) 这一篇文章将为大家介绍如何使用WIX自定义UI.上一篇文章我们讲过WIX为我们提供了五种安装界面.每种安装界面都是由不同的Dialog组成.在这里我们挑选一种比较常用 ...

  3. Wix制作安装包

    Wix制作安装包,找起资料来很费劲,记录一下: Product.wxs,该文件只能制作出msi形式的安装包,不能做到自动检测framework. <?xml version="1.0& ...

  4. 【原创】VB6.0应用程序安装包的生成(Setup Factory 9.0制作安装包的方法)

    VB6.0应用程序安装包的生成,利用其自带的打包工具生成的安装程序很简陋,一点不美观:如果想让自己的应用程序安装的时候显得高大上一点,本教程提供使用Setup Factory 9.0制作安装包的方法. ...

  5. 循序渐进做项目系列(5):制作安装包,谁人都可以!——VS制作安装包简明教程

    一开始让我做安装包的时候,其实我是拒绝的.因为我根本就不会做安装包.查了资料之后,我很懵,很晕,很乱,因为不清晰,不简明,不直白.然而经过一番彷徨的挣扎,我终于发现:制作安装包,谁人都可以!故挥狼毫, ...

  6. 使用Qt installer framework制作安装包

    一.介绍 使用Qt库开发的应用程序,一般有两种发布方式:(1)静态编译发布.这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中.其优势是简单单一,所有的依赖库都集中在一起,其缺点也很 ...

  7. VS 制作安装包小窥

    难得忙里偷闲,看到有关VS制作安装包,按下文小试一把,还行,比不上Installshield. 首先在打开 VS2010    >   文件 >新建项目 创建一个安装项目  XXX 在“目 ...

  8. vs2015 制作安装包额外需要安装的软件VSI_bundle

    vs2015 制作安装包额外需要安装的软件VSI_bundle 下载地址:http://files.cnblogs.com/files/sdner/VSI_bundle.rar

  9. [转载]如何用Visual Studio制作安装包

    原文地址:如何用Visual Studio制作安装包作者:蓝羽幽游 环境:Microsoft Visual Studio 2010 语言:C# 构架:.NET Framework 2.0 解决方案名称 ...

随机推荐

  1. NavMesh动态碰撞

    今天遇到一个问题,就是怎样处理一些动态的障碍物. NavMesh是能够躲避静态的障碍物.NavMeshObstacle的作用就是动态添加障碍. 可是有个问题,NavMeshObstacle是圆,连椭圆 ...

  2. javaScript_with用法

    with语句用途 暂时改变作用域链.简化代码. 语法结构 with(object){ //其他语句 } 例1 with(person){ name= "zhang"; addres ...

  3. Spring mvc redirect跳转路径问题

    SpringMVC重定向视图RedirectView小分析 前言 SpringMVC是目前主流的Web MVC框架之一. 本文所讲的部分内容跟SpringMVC的视图机制有关,SpringMVC的视图 ...

  4. 图标插件--jqplot实现柱状图及饼图,表盘图演示样例

    柱状图 在jqPlot图表插件使用说明(一)中,我们已经能够通过jqPlot绘制出比較简单的线形图.通过查看源码.我们也能够看出,线形图是jqPlot默认的图表类型: /** * Class: Ser ...

  5. [_UICascadingTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds

    之前写过一篇<如何更好地限制一个UITextField的输入长度>,在文章最后得到的结论是可以直接使用 UIKIT_EXTERN NSString *const UITextFieldTe ...

  6. 学习游戏服务器开发必看,C++游戏服务器开发常用工具介绍

    C++游戏服务器开发常用工具介绍 在软件开发过程中需要使用的工具类型实属众多,从需求建模到软件测试,从代码编译到工程管理,这些工具都对项目有着不可替代的作用.庄子有云,"吾生也有涯,而知也无 ...

  7. 简洁常用权限系统的设计与实现(五):不维护节点的深度level,手动计算level,构造树

     这种方式,与第三篇中介绍的类似.不同的是,数据库中不存储节点的深度level,增加和修改时,也不用维护.而是,在程序中,实时去计算的. 至于后面的,按照level升序排序,再迭代所有的节点构造树,与 ...

  8. App各种Icon及Launch image的尺寸和用途

    App各种Icon及Launch image的尺寸和用途 IOS7,8 Asset iPhone 6 Plus (@3x) iPhone 6 and iPhone 5 (@2x) iPhone 4s ...

  9. fastjson空对象不显示问题

    今天在网上找了半天,看到一个大神自己搭建的网站,贴出了这个问题的解决办法,大家共享一下,对那些牛X的大神膜拜吧. 例子: Map < String , Object > jsonMap = ...

  10. [02]基于webservice权限系统

    面前,我们已经介绍过.如何使用cxf建立webservice. 那我们要介绍的这款许可制度表结构. 此权限管理系统分为部门管理.员工管理.角色管理,权限管理,授权的人才和企业管理(这里不涉及) 角色管 ...