67

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

4

3 回答 3

148

延迟的自定义操作不能直接访问安装程序属性(参考)。其实只有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 同名的安装程序属性来填充,但键不是安装程序属性。)(请参阅参考资料Propertykey=valueValueCustomActionDataCustomActionData

在我们的场景中,消费自定义操作是一个延迟自定义操作,定义如下:

<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>
于 2012-06-27T19:04:23.860 回答
10

对于我们 C++ schlubs,您检索属性如下:

MsiGetProperty(hInstall, "CustomActionData", buf, &buflen);

然后你解析'buf'。感谢邦德拜

于 2013-07-25T21:13:24.753 回答
5

如果传递给自定义操作的值不是键/对集...

IE

<SetProperty Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/>
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>

...然后可以使用以下方法检索整个 blob:

string data = session["CustomActionData"];
于 2017-02-18T06:30:15.290 回答