web-dev-qa-db-ja.com

カスタムアクションにパラメーターを渡す方法は?

「値」属性を持つカスタムアクションを作成しようとしています。C#コード(TARGETDIRとバージョン)にパラメーターを渡したいのですが。

ただし、DLLENtryとValueは共存できないというエラーが表示されます。ただし、dllentryのないカスタムアクションは無効です。

これはコードです:

 <CustomAction Id="SetMAWPrefferences"
                Value="InstallDir=[TARGETDIR];Version=2.0.0.1"
                Return="check"
                Execute="commit"
                BinaryKey="ImportExportBinary"                    
                />

そしてそれのために私はこのエラーを受け取ります:

エラー9 ICE68:アクション 'SetMAWPrefferences'のカスタムアクションタイプが無効です。

それを行う方法についてのアイデアはありますか?

11
Ehud Grand

Value属性を間違った方法で使用していることに注意してください。

...この属性は、プロパティを設定するためにProperty属性と共に使用する必要があります...ソース


C#でのWiXカスタムアクションの作成とパラメーターの受け渡し の記事に基づいて、次のことを行う必要があります。

  1. 必要な値を持つプロパティを作成します。

    <Property Id="InstallDir" Value="someDefaultValue" />
    <Property Id="Version" Value="2.0.0.1" />
    
  2. InstallDirプロパティを設定するカスタムアクションを作成します。

    <CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" />
    
  3. カスタムアクションを作成します。

    <CustomAction Id="SetMAWPrefferences" 
        Return="check" 
        Execute="commit" 
        BinaryKey="ImportExportBinary" 
        DllEntry="YourCustomAction" />
    
  4. インストールプロセス中に実行するカスタムアクションをスケジュールします。

    <InstallExecuteSequence>
        <Custom Action="SetDirProp" After="CostFinalize" />
        <Custom Action="SetMAWPreferences" ... />
        ...
    </InstallExecuteSequence>
    
  5. 次のように、カスタムアクションからこれらのプロパティにアクセスします。

    [CustomAction]
    public static ActionResult YourCustomAction(Session session)
    {
        // session["InstallDir"]
        // session["Version"]
    }
    
7
Yurii

カスタムアクションにパラメーターを渡す方法は2つあります。1つは即時実行CAで機能し、もう1つは遅延カスタムアクションで機能します。

即時CA(ロールバックできません):

直接のCAに引数を渡すために、必要な名前でプロパティを設定し、セッションからそれにアクセスできます。

Wixの場合:

<Property Id="MyProp" Value="MyValue" />

CAでは:

[CustomAction]
public static ActionResult NameOfMyCA(Session session)
{
    string myArg = session["MyProp"];
}   

遅延CA:

遅延CAに引数を渡すには、 CustomActionDataプロパティ を使用する必要があります。このプロパティは、遅延CAからアクセスできる唯一のプロパティです。

WIXの場合、DTFにはキー/値ディクショナリであるCustomActionDataクラスが含まれており、次を使用してアクセスできます。

Wixの場合:

<CustomAction Id="MyCustomAction" .../>

<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" />

CAでは:

[CustomAction]
public static ActionResult NameOfMyCA(Session session)
{
    CustomActionData data = session.CustomActionData;

    //Access each argument like this:

    string arg1 = data["Arg1"];
    string arg2 = data["Arg2"];
    string arg3 = data["Arg3"];
}    

即時CA + CustomActionData:

即時CAにCustomActionDataを使用したい場合は、次のようにすることができます。

Wixの場合:

<Property Id="MyCustomAction" Value="Arg1=value1;Arg2=value2;Arg3=value3;Arg4=[MyProperty]" />

CAでは:

[CustomAction]
public static ActionResult NameOfMyCA(Session session)
{
    CustomActionData data = new CustomActionData(session["MyCustomAction"]);

    //Access each argument like this:

    string arg1 = data["Arg1"];
    string arg2 = data["Arg2"];
    string arg3 = data["Arg3"];
    string arg4 = session.Format(data["Arg4"]);
}

Arg4の場合、プロパティの値が含まれているため、次のようにアクセスする必要があります。

string arg4 = session.Format(data["Arg4"]);

残念ながら、これは即時CAでのみ機能します。つまり、遅延CAでこのプロパティの値を使用する場合は、2つのカスタムアクションが必要になります。

  • CA 1は、即時実行されるCAのCustomActionDataを設定します。 (プロパティには、CustomActionに定義したのと同じ名前を付けてください。

  • CA 2 CustomActionDataを使用する特定のロジックを持つCA。

すべてのケースでCustomActionDataを使用することをお勧めします。これにより、CAを即時から遅延に簡単に変換でき、コードが読みやすくなります。

参考文献:

session.FormatCustomActionData

30
Rolo