为什么使用Wix安装程序安装后运行应用时会显示“未安装”?

5
在Wix的文档“How To: Run the Installed Application After Setup”中,Publish元素的条件除了包含是否应该运行应用程序的属性外,还包含and NOT Installed
<Publish Dialog="ExitDialog"
         Control="Finish" 
         Event="DoAction" 
         Value="LaunchApplication">WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1 and NOT Installed</Publish>

为什么它在那里?它有什么作用?
3个回答

6
Publish element指向的自定义操作仅在提供的整个条件评估为true时运行。
  • NOT Installed:对于全新安装主要升级,该条件为真。否则始终为假。
  • WIXUI_EXITDIALOGOPTIONALCHECKBOX = 1:当属性设置为1时为真。
因此,将条件转化为语言:只有在WIXUI_EXITDIALOGOPTIONALCHECKBOX也设置为1时,在全新安装和主要升级安装上启动应用程序。否则不会启动。必须同时满足这两个条件才能启动。 从技术上讲Installed实际上是检查正在安装的MSI的产品GUID是否已经在系统上注册为已安装。如果是,则条件NOT Installed评估为true。
启动应用程序:是的,这可能有点令人困惑,但它确实按照文档中所说的执行:仅在全新安装期间启动应用程序,而不是在修复修改卸载小型升级补丁(或其他安装模式)期间启动。
有趣的是,它也应该在交互式主要升级期间启动应用程序(对于新安装在旧版本之上的升级,Installed不为true,但对于正在卸载的安装程序而言是真的——主要升级实质上是旧版本的卸载和新版本的全新安装)。
因此,NOT Installed似乎只在两种情况下为真:全新安装主要升级。您想要自动启动应用程序的两种情况?
由于在静默安装模式中跳过了InstallUISequence,因此在静默安装后不会启动应用程序,因为您的对话框永远不会遇到(仅运行InstallExecuteSequence)。
离题,类似问题- LaunchCondition我刚刚在几天前评论了几乎相同的问题,在LaunchConditions的背景下。如果您跟随链接,请务必阅读Phil的后续评论。
要使用其他词语,实际上OR'd已安装条件确保LaunchCondition仅适用于全新安装(或在主要升级情况下,新软件包安装在旧软件包之上)。这似乎是WiX团队的一个巧妙功能 - 我注意到Installshield似乎没有使用这个概念。我没有测试过这个功能,但它似乎是一个好的概念。
或者,正如Phil在上面链接的评论中所述,在LaunchConditions的背景下,您可以将LaunchConditions actions条件化,而不是使LaunchConditon条件变得复杂。不确定哪个更好。
更新: 关于条件: MSI条件可能会令人困惑。以下是一些解决方法的资源: 我还有一个链接要提供,但它存在一些微妙的问题,因此我想在将人们发送到内容之前进行测试。

0

从“未安装”这样的(表面上看来很随意的)条件中可能不清楚,但是有一组标准的Windows Installer属性,而已安装就是其中之一:

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

如果产品代码在系统上注册为已安装,则该产品被“安装”。在WiX源的上下文中,这意味着“仅在产品尚未安装时运行”。
条件在自定义操作中尤为重要。如果您没有在自定义操作上放置任何条件,则它将在安装时运行,并且每当进行安装类型操作(例如卸载、修复、应用补丁)时也会运行。条件在此处有记录:

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


0

未安装 条件旨在确保即使默认情况下将 WIXUI_EXITDIALOGOPTIONALCHECKBOX 设置为 1,该操作也仅在 exe 强烈可能存在的情况下发布。为什么要这样做?如果有人选择启动不存在的 exe,则会出现错误消息或缺少 UI,这可能会让用户感到困惑。在安装过程的其他部分中,启动失败可能会中止并回滚安装程序。

那么为什么条件是 安装 呢?这对您来说可能听起来颠倒了。但这不是意外。 已安装 属性在安装程序启动时设置,并且直到下一次启动之前不进行更新。即使安装程序通过安装或卸载产品改变状态,已安装 的值也不会更改。

那么,在哪些场景下,ExitDialog 上的 未安装 将为真呢?

首次安装: 已安装将会开始并保持为false,所以最终未安装将会是true。如果安装成功完成,你的exe文件可能就在那里了。如果安装被取消或回滚,安装程序可能会显示一个不提供启动选项的不同的最终对话框。

维护、修复、卸载: 已安装将会开始为true,所以在完成后未安装将会是false。这可能会导致在修复场景中出现错误的负面影响;exe文件可能存在,但安装程序将不会尝试启动它。但更重要的是,它可以防止在刚刚卸载了exe文件后尝试启动它。

升级: 根据升级类型的不同,这将等效于之前的某种情况。小型升级和小型更新是一种维护形式,而主要升级则类似于首次安装。

请注意,这个条件在更复杂的项目中可能不是绝对可靠的。如果您的exe仅安装在您的某些配置子集中(例如,如果它仅由您可以选择排除的功能或依赖于操作系统版本的组件安装),则您可能需要增强该条件或完全删除启动操作。
✱ 我说可能会显示不同的对话框,因为我不确定WixUI_Minimal在这里的作用。如果它显示相同的对话框,则该条件不足以实现我在这里描述的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接