使用WiX自定义操作设置属性的值

时间:2011-09-12 13:37:49

标签: wix custom-action

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

阅读WiX tutorial的以下部分:

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

答案 2 :(得分: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;
    }