WiX Bundle bal:condition - util:RegistrySearch变量总是false



如果没有安装第三方软件元素,我希望我的安装失败。我添加了一个Fragment,一个util:RegistrySearch和一个bal:ConditionBundle,但我不能让它工作。ThirdPartyCOMLibraryInstalled的计算结果永远不会为true。我已经确认密钥存在,并且我为Key使用的值是正确的-我从regedit中复制/粘贴了所选密钥的名称。日志中没有任何错误。

我在windows s 7 64位的Visual Studio 2012中使用WiXTools 3.7构建安装程序,并在windows s XP SP3和windows s 7 64位上进行测试。

在网上搜索util:RegistrySearch的其他示例时,我遇到了条件测试表达式的以下替代形式。

  1. ThirdPartyCOMLibraryInstalled = 0 -始终为False
  2. ThirdPartyCOMLibraryInstalled <> 1 - always True

Bundle代码:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
     xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension"
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
    <Bundle Name="!(bind.packageName.MyApp)"
            Version="!(bind.packageVersion.MyApp)"
            Manufacturer="!(bind.packageManufacturer.MyApp)"
            UpgradeCode="a07ce1d5-a7ed-4d89-a7ee-fb13a5dd69ba"
            Copyright="Copyright (c) 2013 [Bundle/@Manufacturer]. All rights reserved."
            IconSourceFile="$(var.My_Application1.ProjectDir)MyCo.ico">
        <bal:Condition Message="ThirdParty Application COM Library Required. Please (re)install ThirdParty Application and ensure 'Windows API' and '.NET Components' are installed."
        >ThirdPartyCOMLibraryInstalled</bal:Condition>
        <Variable Name="InstallFolder"
                  Type="string"
                  Value="[ProgramFilesFolder]MyCo SystemsMy_Application"/>
        <BootstrapperApplicationRef
            Id="WixStandardBootstrapperApplication.HyperlinkLicense" >
            <bal:WixStandardBootstrapperApplication
                ThemeFile="ResourcesHyperlinkTheme.xml"
                LaunchTarget="[InstallFolder]My_Application.exe"
                LocalizationFile="ResourcesHyperlinkTheme.wxl"
                SuppressRepair="yes"
                SuppressOptionsUI="yes"
                LicenseUrl=""
                LogoFile="Resources/MyCoLogoWt64.png"
            />
        </BootstrapperApplicationRef>
        <Chain>
            <PackageGroupRef Id="NetFx40Redist"/>
            <MsiPackage Id ="MyApp"
                        Vital="yes"
                        Name="My Application"
                        SourceFile="$(var.MyApp_Install.TargetDir)MyApp_Install.msi">
                <MsiProperty Name="INSTALLLOCATION"
                             Value="[InstallFolder]" />
            </MsiPackage>
        </Chain>
    </Bundle>
    <Fragment>
      <util:RegistrySearch
            Variable="ThirdPartyCOMLibraryInstalled"
            Result="exists"
            Root="HKLM"
            Key="SOFTWAREClassesThirdPartyId.ServerCLSID"/>
    </Fragment>
</Wix>

根本问题是RegistrySearch是在一个单独的Fragment,永远不会被引用。因为Fragment中没有任何内容被引用,链接器"优化"了Fragment的内容,搜索不包括在Bundle中。

旁白:你可能会争辩说,在Condition中有一个对搜索中提到的变量的引用,链接器应该能够找出搜索是必要的。然而,这并不是在所有情况下都有效。

幸运的是,解决方案很简单!您甚至必须从以下两个选项中选择一个:

  1. RegistrySearch元素移动到Bundle元素。
  2. Bundle元素中添加RegistrySearchRef元素,以引用Fragment中的RegistrySearch。您还需要提供RegistrySearchId属性。

就我个人而言,我喜欢选项二,我甚至可能会将Condition移动到Fragment以及将所有这些东西组合在一起。类似于:

<Bundle ...>
   <util:RegistrySearchRef Id='SearchForThirdParty' />
   ...
</Bundle>
<Fragment>
   <util:RegistrySearch
          Id='SearchForThirdParty' 
          Variable="ThirdPartyCOMLibraryInstalled" 
          Result="exists"
          Root="HKLM"
          Key="SOFTWAREClassesThirdPartyId.ServerCLSID"/>
    <bal:Condition Message="ThirdParty Application COM Library Required. Please (re)install ThirdParty Application and ensure 'Windows API' and '.Net Components' are installed.">ThirdPartyCOMLibraryInstalled</bal:Condition>
  </Fragment>
</Wix>

应该可以了

相关内容

  • 没有找到相关文章

最新更新