0

我正在尝试使我的设置支持每用户和每台机器的安装。我希望用户通过单选按钮从 UI 中选择是按用户还是按机器安装软件,并根据该选择选择不同的自定义操作和要复制的不同文件。

我发现我可以使用 util:XmlFile 元素来更改一些基于安装范围不同的文件,但问题是这个组件是在 UI 更改属性之前运行的。以下是代码片段:

    <Property Id='ADXLoaderPrivileges' Value='bla' />
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Component Id="adxloader.dll.manifest" Guid="51FC65CB-BEAD-4423-A840-49C9CB22E191">
            <File Id="adxloader.dll.manifest" Source="$(var.ExcelProjectDir)\Loader\adxloader.dll.manifest" DiskId="1" KeyPath="yes" />
            <util:XmlFile Id="ModifyAdxLoaderManifest" Action="setValue"
                          ElementPath="/configuration/loaderSettings/@privileges" File="[TARGETDIR]\adxloader.dll.manifest" Value="[ADXLoaderPrivileges]" />
        </Component>
    </Directory>

    <Dialog Id='AllUsersChoice' X='50' Y='50' Width='373' Height='287' Title='[ProductName]' TrackDiskSpace='yes'>
       <Control Id='NextButton' Type='PushButton' X='300' Y='261' Width='66' Height='18' Text='{\VSI_MS_Sans_Serif13.0_0_0}&amp;Next &gt;' TabSkip='no' Default='yes'>
         <Publish Property='TARGETDIR' Value='[%ProgramFiles]\Manufacturer\ProductName\'><![CDATA[ALLUSERS=2]]></Publish>
         <Publish Property='TARGETDIR' Value='[%APPDATA]\Manufacturer\ProductName\'><![CDATA[ALLUSERS=1]]></Publish>
         <Publish Property='ADXLoaderPrivileges' Value='administrator'><![CDATA[ALLUSERS=2]]></Publish>
         <Publish Property='ADXLoaderPrivileges' Value='user'><![CDATA[ALLUSERS=1]]></Publish>
       </Control>
    </Dialog>

文件根据 ALLUSERS 属性值安装在文件夹中,但 XmlFile 使用“bla”值而不是“管理员”或“用户”执行。

另外,如何根据此选择指定要执行的自定义操作?

4

1 回答 1

1

问题与安装程序使用的属性范围有关。如果您希望用户能够向安装程序传递在安装执行阶段可用的属性,则必须将该属性设为公开。公开一个属性很容易,你只需要把它全大写。在您的情况下,您必须转换ADXLoaderPrivilegesADXLOADERPRIVILEGES.

您的第二个问题也可以相当简单地解决。使用合适的程序(如 orca 或 instedit)编译项目后,请查看安装程序数据库。检查InstallUISequenceInstallExecuteSequence表。在这里您可以看到所有标准和自定义操作。每个动作的执行顺序由Sequence列中的条目决定。您可能已经猜到了:Condition列中的条目根据此处列出的条件决定是否执行操作。

要为 CustomAction 指定条件,请使用以下参考:

  1. 确定您要评估的条件,在您的情况下是 ADXLOADERPRIVILEGES
  2. 编写您的 CustomAction
  3. 将您的 CustomAction 插入安装程序数据库。您可以通过两种不同的方式执行此操作:创建CustomAction嵌套在元素下的Product元素或将其嵌套在元素下Fragment。如果将其嵌套在 a 下Fragment,则必须向元素添加一个CustomActionRef元素Product。最后一条规则仅适用于您不直接安排 CustomAction 的情况。例如,当通过 UI 中的按钮单击执行 CustomAction 时就是这种情况。
  4. 安排您的 CustomAction。在元素中的元素CustomInstallUISequence或下创建元素。元素的属性是元素中属性指定的名称。要确定何时执行 CustomAction,请使用元素的绝对属性,或者使用 或 属性中的任何一个,您可以在其中指定另一个动作(标准或自定义)的名称,它们是相对的。InstallExecuteSequenceProductActionCustomCustomActionIdCustomActionSequenceCustomBeforeAfter
  5. 将条件添加到您的 CustomAction。Custom元素可以有一个子元素,它是条件的文本表示。使用纯文本或将文本嵌入 CDATA 标记中。

以下是一些使用上述概念的代码:

CustomAction 片段

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

带有Custom元素的产品:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="!(loc.Name)" Codepage="1252" Language="!(loc.Lang)" Version="YO.UR.VERS.ION" Manufacturer="!(loc.Manufacturer)" UpgradeCode="PUT-YOUR-GUID-HERE">
        ...
        <InstallExecuteSequence>
          <Custom Action="AlterSqlStringTable" Before="InstallFiles"><![CDATA[ADXLOADERPRIVILEGES = "administrator"]]></Custom>
        </InstallExecuteSequence>
        ...
    </Product>
</Wix>
于 2013-10-23T09:48:40.857 回答