Wixsharp - 将值从ManagedAction传递给ElevatedManagedAction

时间:2017-07-24 22:07:27

标签: wixsharp

我的MSI安装需要两阶段。在第一个我从用户收集数据,在第二个我想使用从第一阶段收集的值运行实际安装。第二阶段需要在更高的背景下运行。

我在Web上发现,将值传递给提升的deffered动作的唯一方法是设置属性。在MSDN文章中(以及网上的一些例子),据说我需要

  • set属性[命名与deffered action的“主键”相同] - 将值传递给deffered action。具体来说,该值可以是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动作中看到键值对。

3 个答案:

答案 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来自作者本身。