1

私の 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 アクションでキーと値のペアが表示されるため、間違った値を渡しているに違いないと思います。

4

3 に答える 3