我正在修改现有的WiX安装程序以处理更新我们其中一个产品的现有安装.有几个值的默认值在属性中指定.这些属性将显示给用户进行编辑,然后由现有安装程序写入自定义配置文件.
我的代码需要足够智能,以检测它是否正在进行全新安装而不是安装旧版本.如果它正在进行全新安装,则需要将属性设置为默认值.但是,如果它正在进行升级,则代码需要从现有配置文件中检索这些属性的值,并将其显示给用户.
从我已经完成的阅读中,我觉得我需要使用51类自定义动作来设置属性.但是,如何实现此自定义操作?
我想我必须首先定义自定义操作以将其放入自定义操作表中,然后我需要在某个地方粘贴一个标记来调用它.然后我需要定义它.
我怎样才能做到这一点?一些示例代码是什么?
在对自定义操作进行了更多研究之后,我相信我已经弄清楚了所有这些。我在 .wxs 文件中添加了一个 <Binary> 标记来标识自定义操作所在的位置。然后我在 CustomAction 中引用了 Binary 标签的 ID。最后,我向 InstallExecuteSequence 部分添加了一个 Custom 标记,该部分通过 ID 引用了 CustomAction 标记。
上面提到的最后一个 Custom 标记需要进入 InstallUISequence 部分,而不是 InstallExecuteSequence 部分,因为需要在显示对话框之前调用自定义操作。
至于自定义动作本身的实现,我在解决方案中添加了一个新的C#自定义动作库项目。在那里,我实现了一个方法,用 [CustomAction] 属性装饰。此方法使用存储在作为参数传递给该方法的 Session 对象中的属性值,并确定当前版本的可执行文件的路径。然后,它执行所需的工作,在程序的配置文件中定位需要跨版本保留的值,并将它们写入升级脚本的其他属性。
小智 5
例子:
[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;
}
Run Code Online (Sandbox Code Playgroud)