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:
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:
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ć.
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl