从控制面板卸载与从.msi中删除不同

时间:2015-04-16 14:18:00

标签: wix windows-installer

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

如果有什么内容?

我问因为以下原因:

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

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

2 个答案:

答案 0 :(得分:12)

以下"讨论"有点失控。但我会把它留在这里,作为研究静音模式和交互式模式安装之间经历差异的人的解释。

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

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

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

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

总之,如果您确实看到基于用户界面级别的安装行为有所不同,则您的MSI包含严重设计缺陷。您应始终确保以交互方式使用等效结果静默运行MSI。正如已经说明的那样,大公司从未以交互方式运行安装,因为他们通过SCCM等软件管理系统推出软件。

  • 4个MSI用户界面,范围从完全无声完全互动

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

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

  • 当您从添加/删除程序中卸载时,正常的UILevel也是3 - 基本用户界面。这意味着也会跳过InstallUISequence。
  • 如果双击MSI并运行卸载,则GUI级别为5 - 完整GUI。如果您选择&#34;更改&#34;添加/删除程序。

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

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

虽然这不是你问的答案,但 最后的结论 来自所有这些是如果你的软件是针对大公司的您不应该在设置的高级GUI上浪费您的设计工作,因为它可能永远不会用于大规模部署方案。您应该使用公共属性参数化您的安装程序可以在命令行或通过转换进行设置,以便您可以轻松控制安装程序,而无需以交互方式运行它。请参阅此帖子:How to make better use of MSI files

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

答案 1 :(得分:1)

右键单击MSI以卸载它,并使用“控制”面板卸载它之间没有实际区别。两者都导致最小的UI(不是完全静默,显示进度条)卸载,并且如果需要将要求提升。

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

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