【问题标题】:Using a WiX custom action to set a property's value使用 WiX 自定义操作设置属性值
【发布时间】:2011-09-12 13:37:49
【问题描述】:

我正在修改现有的 WiX 安装程序,以处理更新我们产品之一的现有安装。有几个值的默认值在属性中指定。这些属性显示给用户进行编辑,然后由现有安装程序写入自定义配置文件。

我的代码需要足够聪明,以检测它是在进行全新安装还是在安装旧版本。如果是进行全新安装,则需要将属性设置为默认值。但如果它正在升级,代码需要从现有配置文件中检索这些属性的值并将其显示给用户。

根据我所做的阅读,在我看来我需要使用type 51 custom action 来设置属性。但是如何实现这个自定义操作呢?

我在想我必须先定义自定义操作以将其放入自定义操作表中,然后我需要在某处粘贴一个标签来调用它。然后我需要定义它。

我该怎么做?一些示例代码是什么?

【问题讨论】:

    标签: wix custom-action


    【解决方案1】:

    在对自定义操作进行了更多研究之后,我相信我已经弄清楚了所有这些。我在 .wxs 文件中添加了一个 标记,以标识自定义操作所在的位置。然后我在 CustomAction 中引用了 Binary 标记的 ID。最后,我在 InstallExecuteSequence 部分添加了一个 Custom 标记,该部分通过 ID 引用了 CustomAction 标记。

    上面提到的最后一个自定义标记需要进入 InstallUISequence 部分,而不是 InstallExecuteSequence 部分,因为需要在显示对话框之前调用自定义操作。

    至于自定义动作本身的实现,我在解决方案中添加了一个新的 C# 自定义动作库项目。在那里,我实现了一个用 [CustomAction] 属性装饰的方法。此方法使用存储在 Session 对象中的属性值作为参数传递给该方法,并确定当前版本的可执行文件的路径。然后,它会在程序的配置文件中定位需要跨版本保留的值,并将它们写入升级脚本的其他属性。

    【讨论】:

    • 你是如何分配属性的,这是你所做的非常模糊的答案,你没有提供任何代码。
    【解决方案2】:

    例子:

        [CustomAction]
        public static ActionResult SetProperty(Session session)
        {
            try
            {
                session.Log("Begin SetProperty action");
    
                session["PROPERTY_NAME"] = "value"
    
    
            }
            catch (Exception exception)
            {
                session.Log("ERROR in custom action SetProperty {0}", exception.ToString());
    
                return ActionResult.Failure;
            }
    
            return ActionResult.Success;
        }
    

    【讨论】:

    • 如何在wxs文件中引用它?
    • 这是要放在安装程序类下吗?
    【解决方案3】:

    阅读WiX tutorial的以下部分:

    1. Extra Actions:概述如何向 MSI 添加自定义操作;
    2. What's Not in the Book:提供了如何在 DLL 中实现自定义操作的示例。

    【讨论】:

    • 这正是我所做的,我想出了我发布的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多