代码之家  ›  专栏  ›  技术社区  ›  Ray Hayes

如何检查CustomAction的属性(WIX)?

  •  0
  • Ray Hayes  · 技术社区  · 15 年前

    我正试图在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 Id="SetManagedDirectXInstalled"
                  Property="MANAGED_DIRECTX_INSTALLED"
                  Value="NOT([MANAGED_DIRECTX] = '') AND NOT ([MANAGED_DIRECTX_DIRECTINPUT] = ''")/>
    

    此自定义操作的顺序如下:

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

    我现在应该能够做的是使用“已安装托管DirectX”来执行某些操作,例如

        <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>
    

    不管我做什么,条件总是错误的(例如,没有安装),即使我知道文件在那里。将msiexec命令与/l*vx一起使用不会在任何位置显示托管DirectX安装的属性。

    当将<条件>与以下项一起使用时,它会成功地阻止安装(尽管在这种情况下,我不再希望阻止安装,但请给出建议)。

    <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!'/>
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   Ray Hayes    15 年前

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

    似乎我必须将这些值与真/假(或空字符串)进行比较,而不仅仅是期望它作为布尔值工作。( Source )

    在这些表达式中,可以使用 属性名(记住它们是 区分大小写)。不存在的属性 名称将被视为空 串。的逻辑值 属性反映它是否 设置_,表示您无法检查 只需使用 财产:

    • 财产
      如果属性已设置且具有 值,即使该值为假。
    • 非财产
      如果根本没有设置属性,则该值将为true。
    • 属性=真
    • 属性=假
      这是检查逻辑属性值的正确方法。
        2
  •  2
  •   Rob Mensching    15 年前
    1. 要进行调试,请使用详细的日志文件。它将显示属性更改时的状态。然后你应该能够用这些知识来评估情况。

    2. 我不久前在这里回答了同样的问题。使用属性名的条件是对存在性的测试。如果属性有任何值,则该属性的存在性测试的计算结果为true。如果要检查属性的值,则需要显式检查。