CustomActionData に設定されたプロパティは、遅延カスタムアクションによってどのように取得されますか?
遅延カスタムアクションは、インストーラープロパティ( reference )に直接アクセスできません。実際、CustomActionData
プロパティのみ
session.CustomActionData
here にリストされている他のメソッドとプロパティは、セッションオブジェクトで使用できます。
したがって、INSTALLLOCATION
などのプロパティを取得する遅延カスタムアクションの場合、タイプ51カスタムアクション(つまり、プロパティ設定カスタムアクション)を使用してその情報を渡す必要があり、CustomActionのC#からデータを消費します。 session.CustomActionData
を介したコード。 ( reference および reference を参照)
以下は、CustomAction1
で取得できるプロパティを設定するタイプ51カスタムアクション(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
属性の値ではなく、Value
属性のkey=value
ペアのキーです。 (重要な要点:CustomActionData
は、消費するカスタムアクションのIDと同じ名前を持つインストーラープロパティを設定することで入力されますが、CustomActionData
キーはインストーラープロパティではありません。)( reference )
このシナリオでは、消費するカスタムアクションは、次のように定義された遅延カスタムアクションです。
<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」を解析します。 Bondbhai に感謝します。
カスタムアクションに渡される値がキー/ペアセットではない場合...
つまり.
<SetProperty Id="CustomAction1" Before="CustomAction1" Value="data" Sequence="execute"/>
<CustomAction Id="CustomAction1" BinaryKey="BinaryId" DllEntry="MethodName" Execute="deferred"/>
...次に、次を使用してblob全体を取得できます。
string data = session["CustomActionData"];