Wix XmlFile元素执行得太早了

时间:2013-10-22 09:42:56

标签: .net wix wix3.7

我正在尝试进行设置以支持每用户和每台计算机的安装。 我希望用户通过单选按钮从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'值而不是'administrator'或'user'执行。

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

1 个答案:

答案 0 :(得分:1)

问题与安装程序使用的属性范围有关。如果您希望用户能够向安装程序传递在安装的执行阶段可用的属性,则必须公开该属性。公开财产非常容易,你只需要写一个ALLCAPS。在您的情况下,您必须将ADXLoaderPrivileges转换为ADXLOADERPRIVILEGES

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

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

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

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

    CustomAction Fragment

    <?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>