如何通过延迟自定义操作检索CustomActionData上的属性设置?
答案 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"];