65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Wix v3.0、Votive 和 Visual Studio 2005/2008 创建安装程序

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (35投票s)

2007年11月26日

CPL

7分钟阅读

viewsIcon

182733

downloadIcon

1563

这是一篇关于使用 Visual Studio 2005/2008 创建 Wix 安装程序的入门介绍。

引言

本文旨在作为 Wix 和 Votive 的绝对初学者入门介绍。

Wix 是 Windows Installer XML,一个基于公共许可证的开源项目。本质上,它是一个从 XML 文件构建 Windows 安装包的工具集。当前稳定版本是 v2,但版本 3 完全可用。版本三确实缺乏文档,经常迫使用户自行搜索帮助。

Votive 是 Wix 的一个插件,它将 Wix 项目类型集成到 Visual Studio 中,允许您在构建安装程序时完全在 IDE 中进行操作。

Visual Studio 2008 是 Microsoft 优秀 IDE 的最新版本。下面概述的步骤也应该适用于 Visual Studio 2005。本文中的示例是针对 .NET 框架 3.5 版本构建的,但应该与 2.0 及以上版本保持不变。

为了能够完成本教程,您需要从 Sourceforge.net 下载并安装 Wix。选择最新的目录。源代码和其他下载可在同一位置获取,但对于我们的目的,我们需要 Wix3.msi。这将同时安装 Wix 和 Votive。

创建一个简单的应用程序作为安装目标。

没有要安装的东西,安装程序就没什么价值了。在这种情况下,我们将创建一个基本的 Windows Forms 应用程序作为我们的安装目标。启动 Visual Studio,选择 文件 -> 新建 -> 项目。选择 Windows Forms 应用程序,将其命名为 InstallationTarget,并为解决方案选择一个合适的目录(我使用了 C:\Development\Wix Tutorial)。

New c# windows project form

Form1 重命名为 frmCongratulations,并在窗体上添加一个 Label。将文本设置为“恭喜,应用程序已成功安装”。

生成应用程序。它应该看起来像这样

Example application main form

到此为止,我们已经完成了构建安装候选程序的工作。接下来我们将处理安装程序本身。

添加安装程序项目

单击 文件 -> 添加新项目。如果您正确安装了 Wix,您将在项目类型下看到一个 Wix 选项。选择此选项。在 Visual Studio 已安装的模板下,选择 Wix 项目,将名称更改为 ExampleInstaller,并设置相应的目录。

Wix project template form

这将会在您的解决方案中创建一个 Wix 项目。该解决方案由以下部分组成:

  • ExampleInstaller.wixproj,项目文件。
  • ExampleInstaller.wxs,一个基本的 Wix XML 文件。这是 Wix 二进制文件用来构建安装包的文件。

关于 Wix 二进制文件的一点说明

在“幕后”,Wix Visual Studio 项目使用一系列二进制文件来构建项目中 XML 文件定义的安装包。Candle 是编译器,Light 是链接器。还有一个库工具(lit)和一个反编译器(Dark)。这些工具可以从命令行访问(事实上,在 Votive 出现之前,它们只能从命令行访问)。编译器和链接器都在 Wix 项目属性页中有自己的属性选项卡。

构建我们的安装程序

此时,我们可以接受 Votive 生成的默认项目设置,并检查它为我们生成的 XML 文件。

 <?xml version="1.0" encoding="UTF-8"?>
  <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
   <Product Id="07cdd126-8d87-46cf-87b0-8731980619fa" 
      Name="PUT-PRODUCT-NAME-HERE" Language="1033"
      Version="1.0.0.0" Manufacturer="PUT-COMPANY-NAME-HERE" 
      UpgradeCode="4b2952e6-8ce6-4254-9796-aa510afe5fc0">
    <Package InstallerVersion="200" Compressed="yes" />

    <Media Id="1" Cabinet="ExampleInstaller.cab" EmbedCab="yes" />
    <Directory Id="TARGETDIR" Name="SourceDir">
     <Directory Id="ProgramFilesFolder">
      <Directory Id="INSTALLLOCATION" Name="PUT-APPLICATION-DIRECTORY-HERE">

       <Component Id="ProductComponent" Guid="17e13748-8d44-47f6-b020-66d29f8a84fe">
        <!-- TODO: Insert your files, registry keys, and other resources here. -->
       </Component>

      </Directory>
     </Directory>
    </Directory>

    <Feature Id="ProductFeature" Title="PUT-FEATURE-TITLE-HERE" Level="1">
     <ComponentRef Id="ProductComponent" />
    </Feature>
   </Product>
  </Wix>

第一行是标准的 XML 声明。

Wix 元素是任何 Wix 安装程序的根元素。它声明了 相应的 XML 命名空间

Product 元素是我们的“主”元素,它基本上将成为最终 MSI 的一部分。每个安装程序只能指定一个 Product 元素。它需要一个唯一的 GUID(文件创建时自动生成)、一个十进制语言 ID(LCID,默认为美国英语 1033;英国 LCID 为 2057)和一个升级代码,这是另一个自动生成的 GUID。还需要产品名称、制造商和版本。

Package 元素包含有关包的属性。在查看安装包时,这些属性可以在 Explorer 中看到。

Media 元素可以保持不变。它描述了安装程序的安装媒体。Votive 会自动将安装程序的 cabinet 文件命名为安装程序项目名称,并将“EmbedCab”的值设置为 yes。不出所料,这会导致安装程序包含一个名为“ExampleInstaller.cab”的 cabinet 文件。如果删除 CabinetEmbedCab 属性,源文件将保持不变,必须与 MSI 一起提供才能进行安装。媒体 ID 由安装程序的 Media 表在内部使用,这是我找到的关于它的唯一信息,除了值应该大于或等于 1。就我们而言,可以将其保留为 1。

声明了一组 Directory 元素。最外面的带有“TARGETDIR”属性的是一个虚拟目录,用于包含描述安装目录结构的其他 Directory 元素。第二个元素是标准的 Windows 安装程序目录。最后一个 Directory 元素是安装位置。我们需要将 Name 属性更改为我们希望安装应用程序的目录名称。

在安装 Directory 元素内是一个 Component 元素。组件是将被放置在一起的资源的逻辑分组。这里我们将我们的应用程序添加到 Wix 文件中。

Feature 元素描述了一个可安装的元素。可以有一个或多个 Feature,并且每个 Feature 必须包含一个或多个 Component

自定义 .wxs 文件

预生成的 wxs 文件为我们提供了一个很好的模板。我们将首先配置模板尚未完成的那些值。

  • 产品
    • Name:更改为“Wix installer walkthrough”
    • Manufacturer:更改为“Duncan Lundie”
  • Directory(目录)
    • 在带有“INSTALLLOCATIONIDDirectory 元素中,将 Name 属性值更改为“Installer Example”
  • 功能
    • Title 属性值更改为“Installation Target”

基础部分已完成,但它仍然无法安装任何东西。为了让它安装我们的示例应用程序的输出,我们需要将以下元素添加到我们已经定义的 Component 元素中。

<File Id="InstallationTarget.exe" 
  Source="../InstallationTarget/InstallationTarget/bin/debug/InstallationTarget.exe"></File>

顾名思义,这将向安装程序引入一个文件。ID 是安装时给该文件的名称(不必是源文件名),Source 是我们示例应用程序输出的完整路径。如果指定的 Source 未找到,构建将失败。

生成解决方案(Ctrl+Shift+B)。假设一切构建正常,您将在 Wix 项目的输出目录中找到 ExampleInstaller.msi。尝试现在运行它。您应该(短暂地)看到这个

Installer running

安装程序完成后,您应该会在 C:\Program Files\Installer Example 中找到一个名为 InstallationTarget.exe 的文件。

恭喜您,您已经使用 Wix 构建了您的第一个安装程序。这个安装程序非常简单,只使用了 Wix 最基本(也是字面意义上的)元素,但它应该能让您对 Wix 的工作方式有所了解。

关于项目输出的一点说明

正如您在上面的示例中所见,Wix 为 File 元素的 Source 值采用固定路径。没有等同于标准设置项目“Primary Project Output”目标的内容。那么我们如何处理构建类型的变化呢?当我们想要创建目标和安装程序的发布版本时,我们该如何处理?幸运的是,我们有一个机制来做到这一点,我们使用一个编译常量,富有想象力地称为 BUILD。打开 Wix 项目的属性页,然后选择 Compiler 选项卡

Compiler property tab

在“Define constants”文本框中,添加 BUILD=Debug,然后保存您的设置。现在,将您的 VS2008 配置更改为 Release。您会注意到您定义的常量消失了;这是因为常量是按配置定义的。在“Define constants”文本框中添加 BUILD=Release

我们现在可以在 Wix XML 中引用此常量。我们使用以下符号:$(var.NAMEOFVARIABLEORCONSTANT)

我们可以将 File 元素的 Source 更改为 Source="../InstallationTarget/InstallationTarget/bin/$(var.BUILD)/InstallationTarget.exe"

当 Wix 构建时,它将用适当的值替换占位符,从而抓取适合构建配置的应用程序版本。

现在您已经创建了一个基本的安装程序,是时候 添加 GUI 了。

© . All rights reserved.