web-dev-qa-db-ja.com

WiXを使用してCustomActionDataをCustomActionに渡す方法は?

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

54
Ayo I

遅延カスタムアクションは、インストーラープロパティ( 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>
127
Ayo I

C++ schlubsの場合、次のようにプロパティを取得します。

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

次に、「buf」を解析します。 Bondbhai に感謝します。

8
Pierre

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

つまり.

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

...次に、次を使用してblob全体を取得できます。

string data = session["CustomActionData"];
4
Dave Andersen