如何使用WiX将CustomActionData传递给CustomAction?
CustomActionData上的属性如何被延迟自定义操作检索?
延迟的自定义操作不能直接访问安装程序属性( 引用 )。 其实只有CustomActionData
属性
session.CustomActionData
以及此处列出的其他方法和属性在会话对象上可用。
因此,对于延迟自定义操作来检索诸如INSTALLLOCATION
类的属性,您必须使用types51的自定义操作(即set属性自定义操作)来传递该信息,并且您将从CustomAction的C#代码通过session.CustomActionData
。 (请参阅参考和参考 )
下面是一个types51自定义操作( CustomAction1
)的例子,它将设置一个可以在CustomAction2
检索的属性。
<CustomAction Id="CustomAction1" Property="CustomAction2" Value="SomeCustomActionDataKey=[INSTALLLOCATION]" />
请注意, Property
属性名称是CustomAction2
。 这个很重要。 属性属性的types51操作的值必须与使用CustomActionData
的自定义操作的名称相同/相同。 (见参考 )
注意Value
属性键/值对中的名称SomeCustomActionDataKey
? 在消费自定义操作( CustomAction2
)中的C#代码中,您将使用以下expression式从CustomActionData
查找该属性:
string somedata = session.CustomActionData["SomeCustomActionDataKey"];
用于从CustomActionData
检索值的键不是types51自定义操作的“ Property
属性中的值,而是“ Value
属性中的key=value
对中的key=value
。 ( 重要内容: CustomActionData
通过设置与使用自定义操作的Id具有相同名称的安装程序属性来填充,但CustomActionData
键不是安装程序属性。 )(请参阅参考资料 )
在我们的场景中,消费自定义操作是一个延迟自定义操作,定义如下:
<Binary Id="SomeIdForYourBinary" SourceFile="SomePathToYourDll" /> <CustomAction Id="CustomAction2" BinaryKey="SomeIdForYourBinary" DllEntry="YourCustomActionMethodName" Execute="deferred" Return="check" HideTarget="no" />
configurationInstallExecuteSequence
当然,使用自定义操作( CustomAction2
)必须在types51自定义操作( CustomAction1
)之后运行。 所以你必须像这样安排他们:
<InstallExecuteSequence> <!--Schedule the execution of the custom actions in the install sequence.--> <Custom Action="CustomAction1" Before="CustomAction2" /> <Custom Action="CustomAction2" After="[SomeInstallerAction]" /> </InstallExecuteSequence>
对于我们的C ++学校来说,您可以按如下方式检索该属性:
MsiGetProperty(hInstall, "CustomActionData", buf, &buflen);
然后你parsing'buf'。 感谢Bondbhai 。
如果传递给自定义操作的值不是密钥/对集合…
即
<SetParameter Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/> <CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>
…然后可以使用以下方法检索整个blob:
string data = session["CustomActionData"];