27

Wxs 3.0 で作成された MSI ファイルがあります。私の MSI は、新しいC# カスタム アクション プロジェクトを使用して記述された C# カスタム アクションを参照します。

カスタムアクションにルーティングされる引数を msiexec に渡したい - 例:

msiexec /i MyApp.msi ENVIRONMENT=TEST#

私の .wxs ファイルでは、次のようにカスタム アクションを参照します。

<Property Id="ENVIRONMENT"/>
<Binary Id="WixCustomAction.dll"  SourceFile="$(var.WixCustomAction.Path)" />
<CustomAction Id="WixCustomAction" BinaryKey="WixCustomAction.dll"    DllEntry="ConfigureSettings"/>
<InstallExecuteSequence>
   <Custom Action="WixCustomAction" After="InstallFiles"></Custom>
</InstallExecuteSequence>

私のC#カスタムアクションは次のように設定されています:

[CustomAction]
public static ActionResult ConfigureSettings(Session session)
{

}

次のようにプロパティにアクセスできることを期待していました。

string environmentName = session.Property["ENVIRONMENT"];

しかし、これはうまくいかないようです。

カスタム アクションで msiexec に渡したプロパティにアクセスするにはどうすればよいですか?

4

5 に答える 5

30

代わりに

<CustomAction Id="SetCustomActionDataValue"
              Return="check"
              Property="Itp.Configurator.WixCustomAction"
              Value="[ENVIRONMENT],G2,[CONFIGFILE],[TARGETDIR]ITP_v$(var.VERSION_MAJOR)" />

あなたはこれを書きます:

<CustomAction Id="SetCustomActionDataValue"
              Return="check"
              Property="Itp.Configurator.WixCustomAction"
              Value="Environment=[ENVIRONMENT];G=G2;ConfigFile=[CONFIGFILE];TargetDir=[TARGETDIR]ITP_v$(var.VERSION_MAJOR)" />

次に、次のように変数を参照できます。

string env=session.CustomActionData["Environment"];
于 2010-05-08T19:06:52.007 に答える
8

カスタム アクションは、InstallFiles の後に実行するために遅延カスタム アクションである必要があります。遅延カスタム アクションはプロパティにアクセスできませんが、CustomActionData にアクセスできます。それについて何をすべきかについての議論については、このブログ投稿を参照してください。(この例は VBScript カスタム アクションですが、session.CustomActionData コレクションから値を取得できます。)

于 2009-05-07T16:39:39.427 に答える
8

ここに私の作業コードがあります:

<Binary Id="MyCA" SourceFile="..\bin\ChainerRun.CA.exe" />

<CustomAction Id="SetCustomActionDataValue" Return="check" Property="CustomActionData" Value="TARGETDIR=[TARGETDIR];AA=Description;" />

<CustomAction Id="ReadAndSet" 
            BinaryKey="MyCA" 
            DllEntry="ReadAndSet" 
            Execute="immediate"
            HideTarget="no" 
            Return="check" />

<InstallExecuteSequence>
    <Custom Action="SetCustomActionDataValue" Before="InstallFiles" />
    <Custom Action="ReadAndSet" After="SetCustomActionDataValue" />
</InstallExecuteSequence>

C# カスタム アクション関数で:

[CustomAction]
public static ActionResult ReadAndSet(Session session)
{
    ActionResult retCode = ActionResult.NotExecuted;

    System.Diagnostics.Debug.Assert(false);

    session.Log("ReadAndSet() begins ...");

    string installLocation = session.CustomActionData["TARGETDIR"];
    string hostName = session.CustomActionData["AA"];
    ...
}
于 2012-01-09T17:22:47.780 に答える