如何使用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"]; 
Interesting Posts