私の MSI インストールは 2 フェーズにする必要があります。最初の段階ではユーザーからデータを収集し、2 番目の段階では、第 1 フェーズで収集した値を使用して実際のインストールを実行します。2 番目のフェーズは、昇格されたコンテキストで実行する必要があります。
昇格されたdefferedアクションに値を渡す唯一の方法は、プロパティを設定することであることがWebでわかりました。MSDN の記事 (および Web 上のいくつかの例) では、私がする必要があると言われています
- プロパティの設定 [延期されたアクションの「主キー」と同じ名前] - 延期されたアクションに渡される値。具体的には、値は key=value 文字列形式の形式で、セミコロンで区切られて繰り返されます。
- インデクサー (キーを渡す) を使用して、deffered アクションで値をフェッチします。
アクションの定義から始めます。
project.Actions = new []
{
new ManagedAction(InstallerActions.LiveBankInstallPrepare, Return.check, When.After, Step.InstallExecute,
Condition.Always, Sequence.InstallExecuteSequence)
{
ActionAssembly = "%this%",
Name = "Preparing installation",
},
new ElevatedManagedAction(InstallerActions.LiveBankInstallExecute, Return.check, When.After, Step.InstallExecute,
Condition.Always, Sequence.InstallExecuteSequence)
{
ActionAssembly = "%this%",
Name = "Executing installation",
Id = "ABCD"
},
};
最初のアクションでデータを収集したら、延期されたアクションの ID と同じ名前のプロパティに保存します
propertyDict = BuildSemicolonSeparatedDict();
session["ABCD"] = propertyDict;
// 実行時の propertyDict は、例: execMode=InstallForced; タイムアウト=5
私が持っている質問は次のとおりです。
最初のステップ(アクション)で割り当てられたpropertyDictがdefferedアクションで表示されないというのは、私が間違っていることです。
var execMode = session.CustomActionData["execMode"];
//key not found in the dictionary, however propertyDict built in the first action contains it.
UsesPropertiesプロパティを使用してアクション パラメータを静的に設定すると、deffered アクションでキーと値のペアが表示されるため、間違った値を渡しているに違いないと思います。