延迟的自定义操作如何检索CustomActionData上的属性设置?
3 回答
延迟的自定义操作不能直接访问安装程序属性(参考)。其实只有CustomActionData
财产
session.CustomActionData
此处列出的其他方法和属性可用于会话对象。
因此,对于一个延迟自定义操作来检索诸如 之类的属性INSTALLLOCATION
,您必须使用类型 51 自定义操作(即 set-property 自定义操作)来传递该信息,并且您将使用来自 CustomAction 的 C# 代码的数据通过session.CustomActionData
. (见参考和参考)
下面是类型 51 自定义操作 ( CustomAction1
) 的示例,它将设置可以在 中检索的属性CustomAction2
。
<CustomAction Id="CustomAction1"
Property="CustomAction2"
Value="SomeCustomActionDataKey=[INSTALLLOCATION]"
/>
请注意,Property
属性名称是CustomAction2
. 这个很重要。类型 51 操作的 Property 属性值必须与正在使用的自定义操作的名称相同/相同CustomActionData
。(见参考)
注意属性键/值对SomeCustomActionDataKey
中的名称?Value
在消费自定义操作 ( ) 中的 C# 代码中,您将使用以下表达式CustomAction2
查找该属性:CustomActionData
string somedata = session.CustomActionData["SomeCustomActionDataKey"];
用于从中检索值的键不是类型 51 自定义操作CustomActionData
的属性中的值,而是来自属性对的键。(重要提示:通过设置与消费自定义操作的 Id 同名的安装程序属性来填充,但键不是安装程序属性。)(请参阅参考资料)Property
key=value
Value
CustomActionData
CustomActionData
在我们的场景中,消费自定义操作是一个延迟自定义操作,定义如下:
<Binary Id="SomeIdForYourBinary" SourceFile="SomePathToYourDll" />
<CustomAction Id="CustomAction2"
BinaryKey="SomeIdForYourBinary"
DllEntry="YourCustomActionMethodName"
Execute="deferred"
Return="check"
HideTarget="no"
/>
配置 InstallExecuteSequence
当然,消费自定义操作 ( CustomAction2
) 必须在类型 51 自定义操作 ( 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++ schlubs,您检索属性如下:
MsiGetProperty(hInstall, "CustomActionData", buf, &buflen);
然后你解析'buf'。感谢邦德拜。
如果传递给自定义操作的值不是键/对集...
IE
<SetProperty Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/>
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>
...然后可以使用以下方法检索整个 blob:
string data = session["CustomActionData"];