WiX - 当触发具有更高顺序的SpawnDialog时执行较低顺序的DoAction?

时间:2015-10-21 14:24:37

标签: visual-studio wix

首先,我将澄清一个代码片段,然后总结它为解决我遇到的问题所做的工作。随意提问,因为我不是常规海报,但我知道某些规则。

考虑以下匿名的WiX UIConfiguration:

<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="WebInstallationAddressDlg" Order="1">1</Publish>
<!--When neither Feature1 nor Feature2 will be installed we shouldn't show the WebInstallationAddressDlg -->      
<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="InstallDirDlgCustomized" Order="2"><![CDATA[&Feature1 <> 3 AND &Feature2 <> 3]]></Publish>      
<Publish Dialog="CustomizeDlg" Control="Next" Event="DoAction" Value="GetIISWebSites" Order="3">1</Publish>
<Publish Dialog="CustomizeDlg" Control="Next" Event="SpawnDialog" Value="Warning1" Order="4"><![CDATA[&Feature2 = 3 AND SKIPMESSAGE <> "1"]]></Publish>
<!--When Feature1 is set to be installed, the OS needs to be Server 2008 R2 or Server 2012 R2. So NOT (Server 2008 OR Server 2012). 
NTProductType = 1 indicates that it can't be a client type installation (not Windows 7 for example) (see https://msdn.microsoft.com/library/aa370556.aspx) -->
<Publish Dialog="CustomizeDlg" Control="Next" Event="SpawnDialog" Value="Error1" Order="5"><![CDATA[&Feature1 = 3 AND ((VersionNT <> 601 AND VersionNT <> 603) OR MsiNTProductType = 1)]]></Publish>

这些是选项(从上到下):

  • 没什么特别的,转换到下一个对话框
  • 不会安装任何功能,跳过下一个对话框并转到后面的那个
  • 这个条件是检查是否会安装任何一个功能(为了确保条件为真,我在这里使用了1)。此操作将从IIS检索网站(它的作用实际上是无关紧要的)
  • 安装功能2时显示警告
  • 尝试在错误的操作系统上安装功能1时显示错误

什么有效:

  • 根据条件显示警告和错误消息
    • 此处仅触发一个SpawnDialog(即使两个条件都评估为TRUE)
  • 在未安装任何功能时跳过下一个对话框

什么行不通

  • 当SpawnDialogs评估为FALSE时,仅执行GetIISWebSites DoAction。

我的印象是DoAction不关心它给出的Order(权重),并且当条件评估为TRUE时总是执行。 我想要的是当没有显示警告/错误时执行此DoAction。

额外信息

我正在使用Visual Studio(.wixproj)和一个bootstrapper项目来生成Setup.exe和第三个带有自定义操作的项目。

命名空间(它看起来实际上已经过时但它仍然有效)。

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:iis="http://schemas.microsoft.com/wix/IIsExtension">

1 个答案:

答案 0 :(得分:1)

&#34;我的印象是DoAction并不关心它给出的订单(重量),并且当它的条件评估为TRUE时总是执行#34;&#34;

是对的。订单是它们运行的​​顺序,如果条件正确,它们都将运行。如果您希望仅在运行(或不运行)先前操作时才运行操作,则为其指定相同的条件。看起来你的GetIISWebSites上的条件是1,所以是的,它总会被调用。

此处的基本MSI文档说明了依次调用每个事件。

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

另外请注意,您的条件不会违反有关可以发布的对话框数量的规则。它没有说出什么会出错,我也不知道。