【问题标题】:Wix Toolset: How to determine installation mode in a Custom ActionWix 工具集:如何在自定义操作中确定安装模式
【发布时间】:2018-04-09 02:40:31
【问题描述】:

是否有机会在自定义操作中检查安装模式的类型。 我想为安装和卸载模式创建一个自定义操作,但根据模式执行不同的逻辑。

类似:

public static ActionResult CreateBackUpAction(Session session)
{
    //if (InstallType == "Install")
    //{
    //  BackUpFiles();
    //}
    //else if (InstallType == "Remove")
    //{
    //    DeleteBackUpFiles();
    //}

    return ActionResult.Success;
}

我知道理想情况下我应该对这两种情况采取 2 种不同的操作,但我想尽量减少安装程序源代码中的行数。

【问题讨论】:

    标签: c# wix windows-installer custom-action


    【解决方案1】:

    您应该能够使用会话对象的 Item 来获取当前安装的属性值。 session["REMOVE"] 的值(应该是"ALL")会告诉你这是卸载,如果是全新安装,session["Installed"] 的值会告诉你。

    但是,是的,您应该使用这些类型的条件来调用单独的自定义操作,原因如下:

    1. 这意味着您无需担心延迟自定义操作和属性,并且需要将延迟自定义操作模型与 CustomActionData 一起使用,因为 Windows 会处理它。例如,如果自定义操作被延迟,则使用会话 ["REMOVE"] 可能不起作用。本文档没有说 Installed 或 REMOVE 属性在延迟自定义操作中可用,因此您将使用 session.CustomActionData 和另一个自定义操作来设置它。

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa370543(v=vs.85).aspx

    1. 对进程外方法的托管代码自定义操作调用并不便宜。当您可以使用 Not Installed 作为条件时,您将调用所有该机制并返回。如果您有可以更改的功能,或者发生了维修,那么如果您对呼叫没有条件,您将再次致电并再次返回(什么也没做)。

    2. 您没有处理回滚的好方法,因为(例如)如果卸载失败并回滚,我假设您实际上更愿意保留您正在删除的那些备份文件代码。换句话说,在安装失败、卸载失败、回滚以及升级现有已安装产品时,不清楚您想如何处理这些备份文件。

    我还认为,做一件事的几个较小的集中自定义操作比充满条件的一大段代码更容易处理。

    【讨论】:

    • Phil,断章取意,但是当人们谈论 CustomActionData 和延迟模式时,我总是会想到 this blog post from Painter。好主意——尽管 MSI 正走向过时(尽管企业大量采用)。如果没有别的我在阅读该博客条目后熟悉“肌肉”这个词:-)。我希望在我不得不为延迟模式属性实现大量序列化/反序列化的那一天拥有这个 JSON 解决方案。
    猜你喜欢
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    相关资源
    最近更新 更多