我正在尝试进行设置以支持每用户和每台计算机的安装。 我希望用户通过单选按钮从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'执行。
另外,如何根据此选择指定要执行的自定义操作?
答案 0 :(得分:1)
问题与安装程序使用的属性范围有关。如果您希望用户能够向安装程序传递在安装的执行阶段可用的属性,则必须公开该属性。公开财产非常容易,你只需要写一个ALLCAPS。在您的情况下,您必须将ADXLoaderPrivileges
转换为ADXLOADERPRIVILEGES
。
你的第二个问题也可以简单地解决。使用合适的程序(如orca或instedit)编译项目后,请查看安装程序数据库。检查InstallUISequence
和InstallExecuteSequence
表。在这里,您可以看到所有标准和自定义操作。执行每个操作的顺序由Sequence
列中的条目确定。您可能已经猜到了:Condition
列中的条目根据此处列出的条件决定是否根据条件执行操作。
要为CustomAction指定条件,请使用以下参考:
CustomAction
元素下的Product
元素,或将其嵌套在Fragment
元素下。如果您将其嵌套在Fragment
下,则必须在CustomActionRef
元素中添加Product
元素。最后一条规则仅适用于未直接安排CustomAction的情况。例如,当UI中的按钮单击执行CustomAction时就是这种情况。Custom
或InstallUISequence
元素中的InstallExecuteSequence
元素下创建Product
个元素。 Action
元素的Custom
属性是CustomAction
元素中Id
属性指定的CustomAction
的名称。要确定何时执行CustomAction,请使用Sequence
元素的Custom
属性(绝对值),或使用Before
或After
属性中的任何一个指定另一个Action(标准或自定义)的名称,它们是相对的。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>