「値」属性を持つカスタムアクションを作成しようとしています。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'のカスタムアクションタイプが無効です。
それを行う方法についてのアイデアはありますか?
Value
属性を間違った方法で使用していることに注意してください。
...この属性は、プロパティを設定するためにProperty属性と共に使用する必要があります...ソース
C#でのWiXカスタムアクションの作成とパラメーターの受け渡し の記事に基づいて、次のことを行う必要があります。
必要な値を持つプロパティを作成します。
<Property Id="InstallDir" Value="someDefaultValue" />
<Property Id="Version" Value="2.0.0.1" />
InstallDir
プロパティを設定するカスタムアクションを作成します。
<CustomAction Id="SetDirProp" Property="InstallDir" Value="[TARGETDIR]" />
カスタムアクションを作成します。
<CustomAction Id="SetMAWPrefferences"
Return="check"
Execute="commit"
BinaryKey="ImportExportBinary"
DllEntry="YourCustomAction" />
インストールプロセス中に実行するカスタムアクションをスケジュールします。
<InstallExecuteSequence>
<Custom Action="SetDirProp" After="CostFinalize" />
<Custom Action="SetMAWPreferences" ... />
...
</InstallExecuteSequence>
次のように、カスタムアクションからこれらのプロパティにアクセスします。
[CustomAction]
public static ActionResult YourCustomAction(Session session)
{
// session["InstallDir"]
// session["Version"]
}
カスタムアクションにパラメーターを渡す方法は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を即時から遅延に簡単に変換でき、コードが読みやすくなります。
参考文献: