WIX插件安装包的生成(一)最简安装与安装风格

公司要求对winform编写的AutoCAD Electrical插件生成安装包,以实现一键安装插件功能以及自动更新内部新版本功能。这篇文章可能会记录的很精炼,因此每一句话都可能是重点哦~

关键词:wix基础;AutoCAD插件;msi安装包;自动更新
**

一、wix最简安装包生成

**
先说一下wix的基本使用情况。wix是使用xml代码编写的一种能够创建 Microsoft Windows Installer 数据库文件(MSI 和 MSM)的一组工具,说白了就是把你生成的exe或dll文件以及编译执行过程中需要的程序集等内容打包成两个文件,.msi文件和.cab文件。其中,.msi文件相当于一个程序的组成文件,而.cab文件相当于把你的内部文件生成一个压缩包。
这里写图片描述
至于具体怎么生成安装包,我们这里来个例子,就叫他“test”。我们打开visual studio 2013,新建一个名为test的winform项目,并且让其新生成一个解决方案。就先保持这个空白项目,我们再右键解决方案新建一个wix项目(这里需要先安装wix工具,我这里安装的是wix3.11),将其命名为testUpdate。
这里写图片描述
自动生成wix的结构
自动生成的wxs文件一般如上图所示,其中第一部分是生成安装包的基本信息我这里不做修改,只填入manufacture的内容不然不能编译;第二部分是自行划分的组件,划分方式一开始摸不着头脑,之后了解到,基本第三部分划分了多少文件夹,或者说你往里面的多少个文件夹放了东西,就设置多少个组件,大概思路是这样我们接着往后看;第三部分是安装完成后我们希望的文件夹内部结构,其中SourceDir默认为C盘,相对应的ProgramFilesFolder是C盘中program files文件夹(或是x86),而tSetup即指我们安装的根文件夹,要注意在此之后的文件夹都要进行ID和name双参数设置,以便调用和命名文件夹;第四部分是针对第二部分组件进行的详细设置,我们引入一段代码:

<Fragment>
    <ComponentGroup Id="ProductComponents" Directory="TESTFILEPRODUCTDIR">
      <Component Id="ProductComponent">
        <File Id="testAssembly" Source="$(var.test.TargetPath)"  KeyPath="yes"/>
      </Component>
    </ComponentGroup>
</Fragment>

fragment将整个部分括起来,其中可以分作多个componentgroup,每一个componentgroup对应第二部分的一个componentgroupRefID相互对应,而其后的directory指你要将以下这些文件放入哪个文件夹(填入第三部分所设计文件夹的ID)。componentgroup中有component,ID随意,里面的file标签表示移动文件,source指文件来源,具体见下表(参考wix官方文档)
这里写图片描述
这里写图片描述
keypath取值yes表示此文件为真个组件的关键路径。
按照上面修改两处之后,我们就可以生成安装包了。

二、增加安装包的选择路径功能
之前的安装包是我们的最简形式,并不具有选择安装路径的功能,这部分以此为引出点介绍wix生成安装包的五种UI风格。首先在referreference中引入WixUIExtension.dll文件,路径是

C:\Program Files (x86)\WiX Toolset v3.11\bin\WixUIExtension.dll

1.WixUI_Minimal风格
WixUI_Minimal是最小的预定义对话框集合,其将Welcome对话框和协议同意对话框结合,选择协议后就直接安装了。这种对话框集合适用于我们的产品没有自定义部件以及不支持变更安装目录的情况。其用法是:

<UIRef Id=”WixUI_Minimal” />

2.WixUI_InstallDir风格
WixUI_InstallDir不支持用户选择安装的部件,但是其增加了让用户选择安装目录的对话框。在Wix文件中需要一个Id为“WIXUI_INSTALLDIR”的属性来产品要安装的目录的ID(ID必须是全部大写,大写的目的是为了能够让用户在对话框中选择的自定义目录能够回写到相对应ID的Directory元素)。其在下面的用例中的用法是:

<Property Id=”WIXUI_INSTALLDIR” Value=”INSTALLFOLDER” />
<UIRef Id=”WixUI_InstallDir” />

3.WixUI_Advanced风格
WixUI_Advanced提供了与WixUI_Minimal类似的一键安装形式。不过其在协议界面提供了配置高级选项的按钮。在高级选项中,我们可以选择该产品是安装给当前用户还是给所有用户的,在Wix文件中需要一个Id为“WixAppFolder”的属性(Property),指定默认选择当前用户(WixPerUserFolder)还是所有用户(WixPerMachineFolder)。另外,需要一个Id为“ApplicationFolderName”的属性来指定产品所安装在的默认文件夹。

<Property Id=”ApplicationFolderName” Value=”HelloWorld” />
<Property Id=”WixAppFolder” Value=”WixPerUserFolder” />
<UIRef Id=”WixUI_Advanced” />

4.WixUI_FeatureTree风格

WixUI_FeatureTree与WixUI_Mondo的区别是WixUI_FeatureTree省略了安装类型对话框。协议同意对话框之后就直接到部件(Feature)选择对话框了。当我们的产品默认是安装所有部件时,更推荐采用WixUI_Feature而不是WixUI_Mondo。其用法是:

<UIRef Id=”WixUI_FeatureTree” />

5.WixUI_Mondo风格

WixUI_Mondo提供了Welcome、协议同意、安装类型选择、部件选择等自定义安装的对话框,但其不支持安装目录的变更。当我们的产品默认情况下不安装全部部件时,这样典型安装(typical)和完全安装(complete)之间就有个明显的区别,此时推荐使用WixUI_Mondo。其用法是:

<UIRef Id=”WixUI_Mondo” />

我们这里采用了WixUI_InstallDir风格,增加后代码如下(需要注意TESTFILEPRODUCTDIR这个文件名分别用在了哪):

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="testUpdate" Language="1033"  Version="0.0.0.0" Manufacturer="ZJU" UpgradeCode="7a545a88-caad-43d6-ae74-4f5f9628f7e6">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate />
        <Feature Id="ProductFeature" Title="testUpdate" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
        </Feature>
        <UI>
          <UIRef Id="WixUI_InstallDir" />
        </UI>
        <Property Id="WIXUI_INSTALLDIR" Value="TESTFILEPRODUCTDIR" />
    </Product>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="TESTFILEPRODUCTDIR" Name="testUpdate" />
            </Directory>
        </Directory>
    </Fragment>

    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="TESTFILEPRODUCTDIR">
      <Component Id="ProductComponent">
        <File Id="testAssembly" Source="$(var.test.TargetPath)"  KeyPath="yes" Assembly="win32"/>
      </Component>
        </ComponentGroup>
    </Fragment>
</Wix>

猜你喜欢

转载自blog.csdn.net/dirichlet_zju/article/details/80114432
今日推荐