【问题标题】:Uninstall from Control Panel is different from Remove from .msi从控制面板卸载不同于从 .msi 中删除
【发布时间】:2015-06-23 00:32:51
【问题描述】:

从控制面板和从 .msi 本身卸载基于 WiX 的 .msi 应用程序有区别吗?

如果有是什么?

我问是因为以下原因:

区别如下:我的 .msi 将一些文件存储在 %PROGRAMDATA% 中。如果我从控制面板卸载,那里的文件会被卸载(似乎 .msi 会跟踪这些文件(它们被定义为组件)),但是当我打开 .msi 并尝试卸载时(我有一个维护对话框)那些文件不会被删除。

另一个区别是:我还有一个自定义操作来停止我的应用程序,如果它正在运行,它在 InstallUISequence 中调用 After="AppSearch",在 InstallExecuteSequence 中调用 Before="CostFinalize",但是从 .msi 中删除它时没有被调用。只有一个对话框显示有文件要删除但正在使用,但是有些进程,当我告诉它停止它们时,它没有这样做。

【问题讨论】:

  • 您在以这些不同方式运行卸载时是否看到了差异?我假设你看到了不同。当设置以静默方式运行时,会跳过整个用户界面序列。
  • 你应该添加你的 Wix 源,这样我们就有更多的东西可以使用。

标签: wix windows-installer installation


【解决方案1】:

接下来的“讨论”有点失控。但我将把它留在这里,作为研究静默模式和交互模式安装之间差异的人们的解释。

是的,简短的回答是您确实可以看到不同的安装或卸载行为,具体取决于您调用(卸载)安装的方式 .

这主要与 MSI 如何以不同的用户界面级别运行有关,这会导致整个用户界面序列InstallUISequence >) 在 MSI 中运行或完全跳过(静默安装)。跳过后,仅在 InstallUISequence 中定义的所有自定义操作将根本不会运行。如果 MSI 设计良好,这不是问题,因为用户界面自定义操作在即时模式下运行,并且不应该对系统进行更改 - 他们应该只查询用户数据和设置、系统状态或帮助用户输入正确的安装数据。如果 MSI 设计不当并且在用户界面中对系统进行了更改,则在静默模式下运行时安装将不完整。 这是一个严重的 MSI 设计错误,当您意识到所有大公司都在静默部署软件时,它变得更加严重。 我在进行企业应用程序重新打包时多次看到此类错误.无论软件有多好,这都不是对软件的信任投票。怪异和不可预知的问题必然会浮出水面。

因此,InstallExecuteSequence(这是在静默安装安装程序时唯一运行的一个)应该具有所有必需的自定义操作,以便在其中插入系统更改以正确设计 MSI。如前所述,仅存在于用户界面序列中的自定义操作应处理从用户获取值和设置,而这些值应由命令行设置和定义,或在静默安装的转换中定义。

自定义操作条件的某些奇怪和错误组合也可能在特殊情况下导致交互式安装和静默安装之间的差异。最后,在 InstallExecuteSequence 中的 InstallFinalize 之后放置自定义操作可能会导致操作在静默运行时失败。当然还有其他潜在问题。

总而言之,如果您确实发现基于用户界面级别的安装行为有所不同,则您的 MSI 包含一个严重的设计缺陷。您应始终确保您的 MSI 可以以静默方式运行,并获得与交互方式相同的结果。如前所述,大公司从不以交互方式运行安装,因为他们通过软件管理系统(如 SCCM)推出软件。

  • 4 个 MSI UI 级别,从完全静音完全交互

    • INSTALLUILEVEL_NONE = 2,(完全静音)
    • INSTALLUILEVEL_BASIC = 3,(进度条和简单的错误处理)
    • INSTALLUILEVEL_REDUCED = 4,(编写的 UI,无向导)
    • INSTALLUILEVEL_FULL = 5(完整用户界面)
  • 重要的一点是对于UILevel 2 和3,InstallUISequence 被跳过
  • 有一个 MSI 属性 UILevel 持有 GUI 级别值 2、3、4 或 5。如果您的自定义操作必须考虑用户界面类型,请选中此属性。这对于不应该显示任何对话框的完全静默安装来说显然是最重要的。

  • 当您右键单击 MSI 并选择卸载时,您通常会运行 UILevel3(带有进度条的基本 UI)。这意味着 InstallUISequence 被跳过。

  • 当您从添加/删除程序中卸载时,正常的UILevel 也是 3 - 基本用户界面。这意味着 InstallUISequence 也会被跳过。
  • 如果您双击 MSI 并运行卸载,您的 GUI 级别为 5 - 全 GUI。如果您在添加/删除程序中选择“更改”,也会发生同样的情况。

总而言之,错误可能仅出现在其中一种模式(静默/非静默)中,因为 MSI 的用户界面序列连同其针对某些用户界面级别的所有自定义操作都被跳过了。换句话说,如果 MSI 设计不当,产品可能会在交互式安装时工作,而在静默安装时失败(反之亦然)。

还可能基于此UILevel 功能错误地在主 MSI 安装序列中设置自定义操作,以便结果因安装模式而异。我已经看到人们从放置在主安装序列中的自定义操作中的代码生成对话框(不允许交互),然后使用UILevel 检查以在静默安装模式下抑制对话框(或者他们也忘记了,触发隐藏在静默模式下运行时停止安装的模式对话框)。这些奇怪的设计结构会根据安装的触发和运行方式导致意外的安装行为。

虽然这不是你所问问题的答案,但最终结论是,如果你的软件是为大公司设计的,你不应该将您的设计精力浪费在设置的高级 GUI 上,因为它可能永远不会用于大规模部署场景。相反,您应该使用可以在 命令行 或通过 transform 设置的 公共属性 参数化您的安装程序,以便可以轻松控制您的安装程序无需以交互方式运行它。看到这个帖子:How to make better use of MSI files

由于我已经远远超出了您的问题,我还应该注意,一些用于服务器安装的高级安装程序可能(适度)受益于良好的 GUI,以帮助人们快速获得您的服务器软件安装和测试。这些安装程序倾向于使用非常高级的功能,例如 IIS、MS SQL、AD 等……对于知识渊博的系统管理员来说,可能需要一些交互性。但俗话说“大多数东西都可以默认”,好的默认设置通常更容易让人们安装和测试,无论是否有知识。如今,许多大公司运行大型虚拟服务器农场(每个用例一个虚拟服务器),因此即使是服务器安装也趋向于自动化以进行大规模部署,然后具有要设置的公共属性的良好参数化安装程序值得赞赏。 较小的公司可能也有服务器虚拟机(使测试变得容易),但他们可能会以交互方式安装您的设置,接受任何默认设置 - 至少这是我的印象。


链接

【讨论】:

    【解决方案2】:

    右键单击 MSI 卸载它和使用控制面板卸载它没有实际区别。两者都会导致最小的 UI(不是完全静音,显示进度条)卸载,并且会在需要时要求提升。

    如果您的设置中有维护模式对话框,那么您的路径可能略有不同 - 您可能会显示一个对话框,提供更改功能、修复或卸载。这可能会导致某处有所不同。

    如果某处有一些代码改变了某些东西,那么谁知道呢?作为一个随机示例,从对话框中卸载可能会选择取消取消按钮。

    【讨论】:

      猜你喜欢
      • 2016-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-09-21
      • 2011-06-18
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多