2013-04-19 10 views
11

Chcę, aby moja instalacja zakończyła się niepowodzeniem, jeśli element oprogramowania innej firmy nie jest zainstalowany. Dodałem Fragment z util:RegistrySearch i bal:Condition do Bundle, ale nie mogę go uruchomić. ThirdPartyCOMLibraryInstalled nigdy nie jest prawdziwe. Potwierdziłem, że klucz istnieje, a wartość, której używam dla Key jest poprawna - kopiuję/wkleja nazwę z wybranego klucza w regedit. W dzienniku nie ma żadnych błędów.Pakiet WiX bal: condition - util: Zmienna rejestruSearch zawsze fałszywa

Buduję instalator za pomocą WiXTools 3.7 w Visual Studio 2012 na Windows   7 64-bitowych i testowych na obu Windows   XP SP3 i Windows   7 64-bitowych.

Wyszukiwanie w Internecie dla innych przykładów dla util:RegistrySearch Przeszukałem następujące alternatywne formularze dla wyrażenia testowego warunku.

  1. ThirdPartyCOMLibraryInstalled = 0 - zawsze Fałsz
  2. ThirdPartyCOMLibraryInstalled <> 1 - zawsze prawdziwe

Oto kod 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 Systems\My_Application\"/> 
     <BootstrapperApplicationRef 
      Id="WixStandardBootstrapperApplication.HyperlinkLicense" > 

      <bal:WixStandardBootstrapperApplication 
       ThemeFile="Resources\HyperlinkTheme.xml" 
       LaunchTarget="[InstallFolder]My_Application.exe" 
       LocalizationFile="Resources\HyperlinkTheme.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="SOFTWARE\Classes\ThirdPartyId.Server\CLSID"/> 
    </Fragment> 
</Wix> 

Odpowiedz

13

Problem root to, że RegistrySearch jest w osobnym Fragment które nigdy dostaje referencje. Ponieważ nie ma nic do odniesienia w Fragment linker "optymalizuje" zawartość Fragment, a wyszukiwanie nie jest zawarte w twoim Bundle.

marginesie: można argumentować, że z faktu, że istnieje odniesienie do zmiennej mowa w poszukiwaniu w Condition że łącznik powinien być w stanie zorientować się, że poszukiwanie jest konieczne. Jednak to nie działa we wszystkich przypadkach.

Na szczęście rozwiązanie jest dość proste! Nawet trzeba wybrać jedną z dwóch:

  1. przesunąć element RegistrySearch do elementu Bundle.
  2. Dodaj element RegistrySearchRef w elemencie Bundle, aby odnieść się do RegistrySearch w Fragment. Konieczne będzie także podanie atrybutu RegistrySearch i Id.

Osobiście lubię Opcja druga i prawdopodobnie nawet przesunąć Condition do Fragment jak również do grupy wszystkie te rzeczy razem. Coś podobnego do:

<Bundle ...> 
    <util:RegistrySearchRef Id='SearchForThirdParty' /> 

    ... 

</Bundle> 

<Fragment> 
    <util:RegistrySearch 
      Id='SearchForThirdParty' 
      Variable="ThirdPartyCOMLibraryInstalled" 
      Result="exists" 
      Root="HKLM" 
      Key="SOFTWARE\Classes\ThirdPartyId.Server\CLSID"/> 

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

To powinno wystarczyć.

+1

To działa dokładnie. Dziękuję Ci. Byłbym szczęśliwy, gdyby opublikowano to w dokumentacji WiX jako jeden z "Przewodników", tj. "Zablokuj instalację bootstrapera w oparciu o brakujący klucz rejestru" Co mogę zrobić, aby tak się stało? –

+0

Brzmi nieźle. Aby dodać pomoc, wyślij żądanie ściągnięcia do gałęzi wix38, zmieniając pliki w: 'src \ chm \ html'. Kod znajduje się pod adresem http://wix.codeplex.com/ –

+0

Patrz żądanie pobierania na codeplex. –

Powiązane problemy