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

最佳答案

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

session.CustomActionData

here 列出的其他方法和属性可用于 session 对象。

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

下面是类型 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/

10-14 03:46