1

我的 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属性静态设置操作参数时,我可以在延迟操作中看到键值对。

4

3 回答 3

0

没有直接的解决方案,但它对我有用:在第一个动作中,我收集了一些数据......并序列化为键值对字符串。比保存到文件。在第二个动作中,我执行相反的过程 - 读取文件,反序列化 - 并在目标延迟动作中获取值。

于 2017-07-26T08:30:48.417 回答
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 中设置它。这就是我知道的可能性。

于 2017-08-17T09:09:08.483 回答
0

在使用ManagedUI. CustomUIDialog示例展示了如何在表单中设置test并在AfterInstall操作中检索它。

您很可能遇到自定义操作的延迟执行问题(某些操作被延迟,如AfterInstall),其中会话值/属性不再可用。

这是作者自己的提示。

于 2020-11-28T02:29:13.177 回答