Wix XmlFile 元素执行得太早
Posted
技术标签:
【中文标题】Wix XmlFile 元素执行得太早【英文标题】:Wix XmlFile element executing too early 【发布时间】:2013-10-22 09:42:55 【问题描述】:我正在尝试使我的设置同时支持每用户和每台机器的安装。 我希望用户通过单选按钮从 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&Next >' 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' 执行。
另外,如何根据这个选择指定要执行的自定义操作?
【问题讨论】:
我认为这可能是范围问题。尝试公开 ADXLoaderPrivileges 属性,即全部大写:ADXLOADERPRIVILEGES。 感谢您解决了问题 @BdN3504,将你的答案塑造成一个“答案”,以便作者能够接受它。 那么这个自定义操作的第二个问题呢?我应该编辑我的问题还是问另一个问题? 【参考方案1】:问题与安装程序使用的属性范围有关。如果您希望用户能够向安装程序传递在安装执行阶段可用的属性,则必须将该属性设为公开。公开一个属性很容易,你只需要把它全大写。在您的情况下,您必须将 ADXLoaderPrivileges
转换为 ADXLOADERPRIVILEGES
。
您的第二个问题也可以相当简单地解决。使用合适的程序(如 orca 或 instedit)编译项目后,请查看安装程序数据库。检查InstallUISequence
和InstallExecuteSequence
表。在这里您可以看到所有标准和自定义操作。每个操作的执行顺序由Sequence
列中的条目决定。您可能已经猜到了:Condition
列中的条目根据此处列出的条件决定是否执行操作。
要为 CustomAction 指定条件,请使用以下参考:
-
确定您要评估的条件,在您的情况下是
ADXLOADERPRIVILEGES
编写您的 CustomAction
将您的 CustomAction 插入安装程序数据库。
您可以通过两种不同的方式执行此操作:创建嵌套在
Product
元素下的CustomAction
元素或将其嵌套在Fragment
元素下。如果将其嵌套在 Fragment
下,则必须将 CustomActionRef
元素添加到 Product
元素。最后一条规则仅适用于您不直接安排 CustomAction 的情况。例如,当通过 UI 中的按钮单击执行 CustomAction 时就是这种情况。
安排您的 CustomAction。
在InstallUISequence
或Product
元素中的InstallExecuteSequence
元素下创建Custom
元素。 Custom
元素的Action
属性是CustomAction
的名称,由Id
属性在CustomAction
元素中指定。要确定 CustomAction 何时执行,请使用 Custom
元素的 Sequence
属性,它是绝对的,或者使用 Before
或 After
属性,在其中指定另一个操作的名称(标准或自定义),它们是相对的。
将条件添加到您的 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>
【讨论】:
以上是关于Wix XmlFile 元素执行得太早的主要内容,如果未能解决你的问题,请参考以下文章