Thursday, August 23rd, 2007...12:34 am
Wartość typu null, typowanie i Windows Update na dokładkę
Programistą wielkim, jak już to nieraz tutaj zaznaczałem nie jestem ale w zasadzie sobie radzę - chociaż to nawet nie o umiejętnościach programistycznych będzie. Tak się jakoś zdarzyło że u jednego z klientów aplikacja ASP .NET która od dłuższego czasu działała poprawnie nagle działać przestała. Brak jej działania objawiał się komunikatem o problemie przy kompilacji, związanym z brakiem jednoznacznego wywołania konstruktora dla klasy ConnectionOptions. Jako że system był patchowany podejrzenia padło na ostatnio wypuszczone poprawki dla .NET 2.0 (tytułowe Windows Update) .
ConnectionOptions pozwala wyspecyfikować opcje połączenia do usługi WMI, w tym również poświadczenia użytkownika które zostaną użyte do nawiązania tego połączenia. W przypadku, gdy chcemy wykonać połączenie w kontekście aktualnie zalogowanego użytkownika jako wartość nazwy użytkownika i hasła należy podać wartość pustą, czyli null (tytułowy null). Problem polega na tym, że przekazanie wartości typu null nic nie mówi o jej typie (tytułowe typowanie).
Tutaj powoli dochodzimy do związku pomiędzy poprawkami, typowaniem i wartościami null. Okazało się, że pomiomo iż nie jest to wprost opisane w artykule KB opisującym poprawkę, poprawka dostarczana wraz z KB928365 zmienia definicję dla klasy ConnectionOptions dodając nowy konstruktor, różniący się typem danych w których przekazywana jest informacja o haśle użytkownika. Ponieważ w aplikacji wywołanie konstrukora zawierała dla tego parametru wartość null nie było możliwe określenie, który z dwóch konstruktorów powinien zostać zastosowany. Rozwiązaniem było zastosowanie zmiennej określonego typu i przypisanie jej wartości null - w wyniku czego otrzymaliśmy silnie typowany null.
Nowy konstrukor dla tej klasy jest opisany w dokumentacji dla nowej wersji VS Orcas na MSDN. Niestety w wersji dla VS 2005 \ .NET 2.0 informacja ta nie została jeszcze uaktualniona i nie zawiera informacji na ten temat, co utrudnia trochę analizę i rozwiązanie problemu.
Zamieszczam tą informację tutaj dlatego, że w przypadku aplikacji korzystających z System.Management w .NET 2.0 po zainstalowaniu wspomnianej poprawki mogą wystąpić problemy - może pomoże to komuś w ich rozwiązaniu.
Morał dla wszystkich jest taki, że należy brać pod wuagę, że obecny interfejs w chwili obecnej może zmienić się w przyszłości. W tym przypadku konstruktor został zachowany, jednak wprowadzenie nowego, w połączeniu z brakiem typowania dla wartości null wygenerowało problem. Jak widać null nullowi nie zawsze jest równy. Dlatego tak ważne jest aby poprawki najpierw przetestować w środowisku testowym, przed wdrożeniem ich w środowisku produkcyjnym.
PS. I tak nieoczekiwanie stałem się autorem community content na MSDN.

2 Comments
August 26th, 2007 at 2:49 pm
wlasnie chcialem cos znalezc z historii niniejszego bloga… i nie ma searcha!
August 26th, 2007 at 3:45 pm
Po zmianie layout trochÄ™ zniknÄ…Å‚. PoprawiÄ™ jak szybko siÄ™ da - narazie pozostaje dowolna wyszukiwarka z dodaniem site:w2k.pl.
Leave a Reply