WIX – Wykrywanie zainstalowanych MSI

imageCzasami przy instalacji trzeba stwierdzić czy zainstalowano już jakiś inny MSI. Może to być .NET, serwer SQL, czy może jakiś zupełnie inny produkt.

.NET

Z samym .NETem sprawa jest dosyć prosta. Wystarczy, że użyjemy biblioteki WixNetFxExtension.dll, która realizuje potrzebną nam funkcjonalność:

<PropertyRef Id="NETFRAMEWORK35"/>
<Condition Message=".NET Framework w wersji 3.5 musi być zainstalowany ([NETFRAMEWORK35])">
  NETFRAMEWORK35
</Condition>

Użycie PropertyRef jest konieczne, aby zastała zaimportowana odpowiednia wartości Property z WixNetFxExtension.dll. Dalej już jest prosto definiujemy element Condtion w  InnerText wpisujemy warunek, który musi być ustawiony na TRUE, aby mogła rozpocząć się instalacja ? całość ląduje w tabeli LaunchCondition. Własność NETFRAMEWORK35 jest ustawiona na #1 jeśli jest zainstalowany .NET Framework 3.5 . W NetFxExtension jest ustawianych bardzo dużo własności, które mogą nas poinformować o wersji SP, a nawet czy zainstalowano Client Profile. Pełny opis w c:\program files\Windows Installer Xml v3\doc\Wix.chm ? hasło ?WixNetfxExtension?.

Inne pakiety

Żeby wykryć inne zainstalowane pakiety można użyć np.: RegistrySearch:

<Property Id="NETFRAMEWORK20">
  <RegistrySearch Id="NetFramework20" Root="HKLM" Key="Software\Microsoft\NET Framework Setup\NDP\v2.0.50727" Name="Install" Type="raw" />
</Property>

Co ustawi, własność NETFRAMEWORK20 na wynik wyszukiwania wartości klucza w rejestrze ? tak naprawdę taką metodą posługuje się NetFxExtension.

Innną metodą jest wyszukiwanie konkretnego zainstalowanego komponentu za pomocą ComponentSearch:

<Property Id="VS2005PROJECTAGGREGATOR2">
  <ComponentSearch Id="VS2005ProjectAggregator2Search" Guid="B0BB80E0-5CCC-474E-A75E-05DC1AE073BC" />
</Property>

Musimy w takiej sytuacji znać Guid komponentu.

Inne możliwości to:

  • IniFileSearch ? pozwala szukać pliku .ini lub konkretnej jego zawartości, to jest trochę przestarzała metoda, ponieważ tych plików już tak często się nie używa
  • DirectorySearch ? wyszukiwanie konkretnego folderu
  • FileSearch ? wyszukiwanie konkretnego pliku

Instalacja zależnych pakietów

W samym pakiecie MSI nie możemy wywoływać instalacji innych pakietów MSI, jest to zabronione. Możemy do naszego instalatora dołączyć tzw. Merge Module, czyli plik z rozszerzeniem .msm, ale takie pliki rzadko są dostarczane przez producentów.

Jedyną skuteczną metodą na zainstalowanie np. .NETa przed instalacją naszej aplikacji jest użycie tzw. MSI chainera, który instaluje pliki .MSI jeden po drugim. Można też posłużyć się czymś bardziej zaawansowanym ? bootstrapperem od clickonce. Temat chainera i bootstrappera to sprawa na osobny wpis, a właściwie całą serię.

Leave a Reply

Your email address will not be published. Required fields are marked *