如何性质上设置CustomActionData通过递延自定义操作进行检索?
Answer 1:
递延自定义操作不能直接访问安装程序属性( 参考 )。 事实上,只有CustomActionData
属性
session.CustomActionData
和其他方法和列出的属性在这里都可以对会话对象。
因此,对于递延自定义操作来检索属性,如INSTALLLOCATION
,你必须使用51式自定义操作-即一组属性自定义操作-来传递信息一起,你会消耗从CustomAction的C#中的数据通过代码session.CustomActionData
。 (参见参考 & 参考 )
下面是一个51类型的自定义动作(例CustomAction1
),将设置了可以在被检索的属性CustomAction2
。
<CustomAction Id="CustomAction1"
Property="CustomAction2"
Value="SomeCustomActionDataKey=[INSTALLLOCATION]"
/>
请注意, Property
属性名称CustomAction2
。 这个很重要。 51类型的动作的属性的属性的值必须等于/等同于正在消耗的自定义动作的名称CustomActionData
。 (参见参考 )
注意名称SomeCustomActionDataKey
的Value
属性键/值对? 在消费自定义操作(C#代码CustomAction2
),你会查找从财产CustomActionData
通过使用下面的表达式:
string somedata = session.CustomActionData["SomeCustomActionDataKey"];
您用来检索从价值的关键CustomActionData
是不是在价值Property
的51式自定义操作的属性,但是从关键key=value
的对Value
的属性。 ( 重要外卖: CustomActionData
通过设置具有相同的名称作为消费自定义动作的标识的安装财产稀少,但CustomActionData
键不Installer属性。)(见参考 )
在我们的场景中消耗的自定义动作定义有点像下面的递延自定义操作:
<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>
Answer 2:
对我们来说,C ++ schlubs,您检索的属性如下:
MsiGetProperty(hInstall, "CustomActionData", buf, &buflen);
然后,解析“BUF”。 谢谢Bondbhai 。
Answer 3:
如果传递给自定义操作的值不是一个键/双组...
即
<SetParameter Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/>
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>
......那么整个斑点可以使用检索:
string data = session["CustomActionData"];