如何通过延迟自定义操作检索 CustomActionData 上的属性设置?
最佳答案
延迟的自定义操作无法直接访问安装程序属性 ( reference )。其实只有CustomActionData
属性
session.CustomActionData
和 here 列出的其他方法和属性可用于 session 对象。
因此,对于要检索属性(例如
INSTALLLOCATION
)的延迟自定义操作,您必须使用类型 51 的自定义操作(即 set-property 自定义操作)来传递该信息,并且您将使用来自 CustomAction 的 C# 的数据代码通过 session.CustomActionData
。 (见 reference 和 reference )下面是类型 51 自定义操作 (
CustomAction1
) 的示例,该操作将设置可在 CustomAction2
中检索的属性。<CustomAction Id="CustomAction1"
Property="CustomAction2"
Value="SomeCustomActionDataKey=[INSTALLLOCATION]"
/>
请注意,
Property
属性名称是 CustomAction2
。这个很重要。 类型 51 操作的 Property 属性值必须与消耗 CustomActionData
的自定义操作的名称相等/相同。 (见reference)注意到
SomeCustomActionDataKey
属性键/值对中的名称 Value
了吗?在使用自定义操作 ( CustomAction2
) 的 C# 代码中,您将使用以下表达式从 CustomActionData
查找该属性:string somedata = session.CustomActionData["SomeCustomActionDataKey"];
您用于从
CustomActionData
中检索值的键不是 51 类型自定义操作的 Property
属性中的值,而是 key=value
对中的 0x2513843124 对中的键。 (重要提示:Value
是通过设置与消费自定义操作的 Id 具有相同名称的安装程序属性填充的,但 CustomActionData
键不是安装程序属性。)(参见 reference在我们的场景中,消费自定义操作是一个延迟自定义操作,定义如下:
<Binary Id="SomeIdForYourBinary" SourceFile="SomePathToYourDll" />
<CustomAction Id="CustomAction2"
BinaryKey="SomeIdForYourBinary"
DllEntry="YourCustomActionMethodName"
Execute="deferred"
Return="check"
HideTarget="no"
/>
配置InstallExecuteSequence
当然,消费自定义操作(
CustomActionData
)必须在类型 51 自定义操作( CustomAction2
)之后运行。所以你必须像这样安排它们:<InstallExecuteSequence>
<!--Schedule the execution of the custom actions in the install sequence.-->
<Custom Action="CustomAction1" Before="CustomAction2" />
<Custom Action="CustomAction2" After="[SomeInstallerAction]" />
</InstallExecuteSequence>
关于wix - 如何使用 WiX 将 CustomActionData 传递给 CustomAction?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11233267/