我的 MSI 安装需要分两阶段进行。第一个我从用户那里收集数据,第二个我想使用第一阶段收集的值运行实际安装。第二阶段需要在提升的环境中运行。
我在网上发现,将值传递给提升的延迟操作的唯一方法是设置属性。在 MSDN 文章(以及网络上的一些示例)中,据说我需要
- 设置属性 [命名与延迟操作的“主键”相同] - 具有要传递给延迟操作的值。具体来说,value 可以是 key=value 字符串格式,重复,分号分隔。
- 使用索引器(传递键)在延迟操作中获取值。
我从动作定义开始:
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。
var execMode = session.CustomActionData["execMode"];
//key not found in the dictionary, however propertyDict built in the first action contains it.
我想我一定是传递了错误的值,因为当我使用UsesProperties属性静态设置操作参数时,我可以在延迟操作中看到键值对。