我的MSI安装需要两阶段。在第一个我从用户收集数据,在第二个我想使用从第一阶段收集的值运行实际安装。第二阶段需要在更高的背景下运行。
我在Web上发现,将值传递给提升的deffered动作的唯一方法是设置属性。在MSDN文章中(以及网上的一些例子),据说我需要
我从动作定义开始:
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动作中看到键值对。
答案 0 :(得分:0)
没有直接解决方案,但它对我有用: 在第一个操作中,我收集了一些数据......并序列化为键值对字符串。比保存到文件。 在第二个操作中,我执行相反的过程 - 读取文件,反序列化 - 并在目标自定义操作中使用值。
答案 1 :(得分:0)
您需要在WixSharp项目中声明这些属性。 对于前。
project.Properties.Add(new Property("Test", "Test"));
然后您可以在CustomAction / Elevated Custom Action
中引用它 new ElevatedManagedAction {
MethodName = "Test",
Return = Return.check,
When = When.Before,
Step = Step.InstallFinalize,
Condition = Condition.NOT_Installed,
Impersonate = false,
Execute = Execute.deferred,
UsesProperties = "Test"
}
现在,您应该可以在自定义操作中使用它/通过MSIRuntime等在UI中设置它。 这就是我知道的可能性。
答案 2 :(得分:0)
实际上比使用input
时要容易。 CustomUIDialog示例说明了如何在表单中设置number
值并通过output
操作检索它。
您最有可能遇到延迟执行自定义操作(某些操作被延迟,例如ManagedUI
)的问题,因为会话值/属性不再可用。
Here is a hint来自作者本身。