67

CustomActionDataに設定されたプロパティは、遅延カスタムアクションによってどのように取得されますか?

4

3 に答える 3

148

遅延カスタムアクションは、インストーラーのプロパティに直接アクセスできません(参照)。実際、CustomActionData財産だけ

session.CustomActionData

ここにリストされている他のメソッドとプロパティは、セッションオブジェクトで使用できます。

したがって、などのプロパティを取得するための遅延カスタムアクションのINSTALLLOCATION場合、タイプ51カスタムアクション(つまり、プロパティの設定カスタムアクション)を使用してその情報を渡す必要があり、CustomActionのC#コードからのデータを使用します。からsession.CustomActionData。(リファレンスリファレンスを参照)

CustomAction1以下は、で取得できるプロパティを設定するタイプ51カスタムアクション()の例です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++シュラブの場合、次のようにプロパティを取得します。

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

次に、「buf」を解析します。ボンドバイに感謝します。

于 2013-07-25T21:13:24.753 に答える
5

カスタムアクションに渡される値がキー/ペアセットではない場合...

すなわち

<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 に答える