1

我正在尝试在 Wix 中组合一个小的“先决条件”对话框,以让用户相信他们拥有运行我的软件所需的所有必需品:

例如,我需要托管 DirectX,所以我寻找一些 DLL:

<Property Id="MANAGED_DIRECTX">
  <DirectorySearch Path="$(env.SystemRoot)\Microsoft.NET\DirectX for Managed Code\1.0.2902.0" Depth="0" Id="MDXDir">
    <FileSearch Name="Microsoft.DirectX.dll"/>
  </DirectorySearch>
</Property>

<Property Id="MANAGED_DIRECTX_DIRECTINPUT">
  <DirectorySearch Path="$(env.SystemRoot)\Microsoft.NET\DirectX for Managed Code\1.0.2902.0" Depth="0" Id="MDXInputDir">
    <FileSearch Name="Microsoft.DirectX.DirectInput.dll"/>
  </DirectorySearch>
</Property>

我还有一个 CustomAction 来组合我的条件逻辑:

<CustomAction Id="SetManagedDirectXInstalled"
              Property="MANAGED_DIRECTX_INSTALLED"
              Value="NOT([MANAGED_DIRECTX] = '') AND NOT ([MANAGED_DIRECTX_DIRECTINPUT] = ''")/>

此 CustomAction 是按顺序排列的:

<InstallExecuteSequence>
  <Custom Action="SetManagedDirectXInstalled" After="AppSearch" />
  <RemoveExistingProducts After="InstallInitialize" />
</InstallExecuteSequence>

我现在应该能够做的是使用“MANAGED DIRECTX INSTALLED”来做一些事情,例如

    <Control Id="NoManagedDirectX" Type="Text" X="20" Y="50" Width="300" Height="60" Transparent="yes" NoPrefix="yes" Hidden="yes">
      <Text>Microsoft Managed DirectX (MDX) for DirectX 9.0 is NOT installed</Text>
      <Condition Action="show">NOT MANAGED_DIRECTX_INSTALLED</Condition>
    </Control>
    <Control Id="ManagedDirectX" Type="Text" X="20" Y="50" Width="300" Height="60" Transparent="yes" NoPrefix="yes" Hidden="yes">
      <Text>Microsoft Managed DirectX (MDX) for DirectX 9.0 is correctly installed</Text>
      <Condition Action="show">MANAGED_DIRECTX_INSTALLED</Condition>
    </Control>

不管我做什么,即使我知道文件在那里,条件总是错误的(例如未安装)。使用带有 /l*vx 的 msiexec 命令不会在任何地方显示 MANAGED DIRECTX INSTALLED 属性。

当 <Condition> 与以下内容一起使用时,它会成功阻止安装(尽管在这种情况下我不再想阻止安装,只是建议)。

<Condition Message="You must have Microsoft Managed DirectX (MDX) for DirectX 9.0 installed">
  MANAGED_DIRECTX AND MANAGED_DIRECTX_DIRECTINPUT
</Condition>

我怎样才能跟踪/调试这个(或者我做错了什么?)


编辑- 我现在确定我的 CustomAction 甚至没有被调用,将其设置为以下也没有显示预期的结果!

<CustomAction Id='SetManagedDirectXInstalled'
              Property='MANAGED_DIRECTX_INSTALLED'
              Value='Something hard-coded'/>

或者

<CustomAction Id='SetManagedDirectXInstalled'
              Error='Some error should show!'/>
4

2 回答 2

3

我想我可能已经找到了答案,但是直到我下一次在我的开发 PC 上我才能尝试它。

看来我必须将值与 TRUE/FALSE (或空字符串)进行比较,而不仅仅是期望它作为布尔值(Source

在这些表达式中,您可以使用属性名称(请记住它们区分大小写)。不存在的属性名称将被视为空字符串。属性的逻辑值反映了它是否已被设置——这意味着您不能仅通过使用该属性来检查逻辑值:

  • PROPERTY
    如果该属性已设置并具有任何值,即使该值为 false,这将评估为 true。
  • NOT PROPERTY
    如果根本没有设置属性,这将评估为 true。
  • 属性 = 真
  • PROPERTY = FALSE
    这是检查逻辑属性值的正确方法。
于 2009-06-18T17:30:07.493 回答
3
  1. 要进行调试,请使用详细日志文件。它将向您显示您的属性的状态,因为它们发生了变化。然后,您应该能够使用该知识评估条件

  2. 不久前我在这里回答了同样的问题。使用属性名称的条件是对存在性的测试。如果 Property 有任何值,则 Property 的存在性测试评估为 true。如果你想检查一个属性的值,你需要明确地这样做。

于 2009-06-18T18:57:37.287 回答