Thursday, August 23rd, 2007...12:34 am

Wartość typu null, typowanie i Windows Update na dokładkę

Jump to Comments

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

Leave a Reply