如何使用WiX将CustomActionData传递给CustomAction?

时间:2012-06-27 19:04:23

标签: wix windows-installer wix3.5 custom-action

如何通过延迟自定义操作检索CustomActionData上的属性设置?

3 个答案:

答案 0 :(得分:125)

延迟的自定义操作无法直接访问安装程序属性(reference)。实际上,只有CustomActionData属性

session.CustomActionData

以及会话对象上列出的here列出的其他方法和属性。

因此,对于检索INSTALLLOCATION等属性的延迟自定义操作,您必须使用类型51自定义操作(即设置属性自定义操作)来传递该信息,并且您将通过session.CustomActionData使用CustomAction的C#代码中的数据。 (见reference& reference

以下是51类自定义操作(CustomAction1)的示例,该操作将设置可在CustomAction2中检索的属性。

<CustomAction Id="CustomAction1"
              Property="CustomAction2"
              Value="SomeCustomActionDataKey=[INSTALLLOCATION]"
/>

请注意,Property属性名称为CustomAction2。这个很重要。 类型51操作的属性属性值必须与消耗CustomActionData的自定义操作的名称相同/相同。(请参阅reference

请注意SomeCustomActionDataKey属性键/值对中的名称Value?在使用自定义操作(CustomAction2)的C#代码中,您将使用以下表达式从CustomActionData查找该属性:

string somedata = session.CustomActionData["SomeCustomActionDataKey"];

用于从CustomActionData检索值的键不是51自定义操作的Property属性中的值,而是来自key=value对中的键的值{1}}属性。 (重要内容:Value通过设置与使用自定义操作的ID同名的安装程序属性来填充,但CustomActionData键不是安装程序属性。) (见reference

在我们的场景中,消费自定义操作是一种延迟的自定义操作,定义方式如下所示:

CustomActionData

配置InstallExecuteSequence

当然,消费自定义操作(<Binary Id="SomeIdForYourBinary" SourceFile="SomePathToYourDll" /> <CustomAction Id="CustomAction2" BinaryKey="SomeIdForYourBinary" DllEntry="YourCustomActionMethodName" Execute="deferred" Return="check" HideTarget="no" /> )必须在类型51自定义操作(CustomAction2)之后运行。所以你必须像这样安排他们:

CustomAction1

答案 1 :(得分:8)

对于我们C ++ schlubs,您可以按如下方式检索Property:

MsiGetProperty(hInstall, "CustomActionData", buf, &buflen);

然后你解析'buf'。感谢您Bondbhai

答案 2 :(得分:3)

如果传递给自定义操作的值不是键/对设置...

<SetParameter Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/>
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>

...然后可以使用以下方法检索整个blob:

string data = session["CustomActionData"];