piątek, marzec 26, 2010

WPF – Ku pamięci

Ponownie nie jest mi dane pisać o TPL. Cóż ważne, że dane jest pisać o czymkolwiek technicznym. Dziś będzie o WPFie i dziwnym błędzie, który męczył mnie przez prawie dwa dni. Być może oszczędzi to komuś trudów. Zacznijmy zatem…

Aplikacją oczywiście w WPFie. Jako, że budowałem dla niej instalator postanowiłem sprawdzić czy wszystkie niezbędne komponenty są dołączane. Chciałem oczywiście, aby w przypadku braku .NET instalował się on skorzystałem z rozwiązania podanego przez Bartka Szafko we wpisie Instalowanie komponentów zależnych. Mój bootstraper wyglądał tak:

<ItemGroup>
    <BootstrapperFile Include="Microsoft.Net.Framework.3.5">
      <Visible>False</Visible>
      <ProductName>.NET Framework 3.5</ProductName>
      <Install>true</Install>
    </BootstrapperFile>
    <BootstrapperFile Include="Microsoft.Windows.Installer.3.1">
      <ProductName>Windows Installer 3.1</ProductName>
    </BootstrapperFile>
</ItemGroup>

Pomijając nieistotne elementy…

Instalator się ładnie budował, proces instalacji na czystej wirtualce XP przebiegał bez problemu ale po zainstalowaniu zamiast działającej aplikacji raczył mnie takim o to widokiem:

error

Ciutkę tajemniczę. Kernel32.dll? Hmm…problem potęgował fakt, że inna aplikacja w WPF działała bez najmniejszego zająknięcia. Próbowałem już chyba wszystkiego: wyrzucanie dll’ek (Enterprise Library, SharpZipLib, HtmlAgilityPack), które mogły powodować, że nie mam czegoś zainstalowanego na tej maszynie. Podglądanie pod reflektorem zależności i próba wymyślenia czego może tam brakować. Instalowanie multum pakietów z nadzieją, że może to rozwiąże problem. Nic nie pomagało…

Byłem praktycznie pokonany, ale dziś czytając o wydajności aplikacji w WPF i jak ją możemy zwięksyć natknąłem się na zadanie, iż w 3.5 SP1 dodano do WPF sporo usprawnień. Żółta lampka :). Wiedziałem, że SP1 dodaje trochę nowych rzeczy do WPFa i pomyślałem o tym, jakby się taki błąd gdy użyję czegoś z SP1 a mam zainstalowany tylko .NET 3.5 objawiał. Sprawdziłem i oczywiście mój bootstraper instalował tylko .NET 3.5 bez SP1. Szybko pobrałem SP1 i zainstalowałem, aby sprawdzić….no i udało się. Program wystartował. Eureka.

Oczywiście problemem był ContentStringFormat, który został dodany w SP1 (lub SP3 do .NET 3.0). W WiX’ie oczywiście miałem sprawdzanie zainstalowania tylko .NET 3.5 dlatego instalator działał poprawnie…

Głupi błąd, ale może ten wpis zaoszczędzi komuś cenny czas. Błąd ten jednak powinien być trochę mniej tajemniczy… teraz zostało tylko dołączyć .NET 3.5 SP1 jako Prerequsite z czym też jest trochę problemów, ale przynajmniej wiadomo co robić.

8 komentarze:

Dawid Cieszyński pisze...

Też się swego czasu z tym męczyłem :)
U mnie to było z brakiem jakiejś metody, ale już nie pamiętam jakiej.

Jakbyś jeszcze nie znalazł rozwiązania to tutaj sprawdzona przeze mnie informacja jak zrobić paczkę do bootstrappera:
http://download.microsoft.com/download/A/2/8/A2807F78-C861-4B66-9B31-9205C3F22252/VS2008SP1Readme.htm#General%20Issues

pawlos pisze...

Dzięki za link. Znalazłem go także, jednak muszę przejść przez te wszystkie kroki tam opisane.

A właśnie? Trzeba zrobić wszystkie kroki tam opisane tj. Update the Package Data, Download and Extract the Core Installation Files oraz Download the Language Pack Support Files?
Trochę roboty z tym jest więc chyba poczekam, aż będę na porządniejszym kompie działał. Na chwilę obecną męczę się z lapkiem....

Dawid Cieszyński pisze...

Language Pack możesz sobie pominąć bo wg tabelki do wersji angielskiej i tak nie ma linku ;)

Chyba, że Twoja aplikacja obsługuje też języki które są tam na liście. (Ja tego nie dodawałem bo miałem aplikację wyłącznie po polsku)

Niestety trochę roboty z tym jest, zwłaszcza ściąganie dużych plików z sieci trochę trwa. W wyniku mam paczkę ok 305MB :) Microsoft mógłby kiedyś pomyśleć o udostępnieniu samej paczki, ale teraz niedługo 4.0 więc nie ma co się spodziewać :D

pawlos pisze...

To fajnie...przynajmniej trochę pracy odejdzie.

Tak czy inaczej muszę poczekać. Dla mnie liczy się sam fakt, że udało się odkryć powód tego problemu. Strasznie mnie to męczyło.

andrzejp pisze...

Dołączałeś bootrstrappera pod 32 bitowym czy 64 bitowym systemem?
Ja miałem ogromne problemy z dołączeniem bootstrappera w 64bitowym win7. Nie udało mi się tego obejść...

pawlos pisze...

Tylko 32bity, ale czeka mnie pewnie i 64bity. Jakbyś mógł podzielić się jakimiś uwagami to pisz.

Pozdrawiam,
Paweł

Dawid Cieszyński pisze...

Ja dołączałem pod 64 bitowym systemem, były problemy ze ścieżkami więc po prostu skopiowałem wszystko z "Program Files (x86)" do "Program Files" ( wszystko z folderu Microsoft SDKs\Windows\v6.0A )

Bartek Szafko pisze...

fajny wpis, faktycznie sprawa trudna do debugowania i warto o czymś takim pamiętać