Kurs ASP.NET, część I (Podstawy .NET)
Data publikacji: 2003-09-07 00:17:47 :: Odsłon: 34661Wprowadził do systemu: Michał Chaniewski
Niewiele zjawisk wpłynęło w takim stopniu na proces wytwarzania oprogramowania, jak burzliwy rozwój Internetu w ciągu ostatnich kilku lat. Jeszcze w połowie lat 90 niemal każdy program działał samodzielnie, w oderwaniu od innych, a wszelka komunikacja sieciowa odbywała się z wykorzystaniem własnych, zamkniętych standardów i protokołów.
Dziś ta sytuacja zaczyna się powoli zmieniać. Widać wyraźny trend do łączenia wszystkiego i ze wszystkim, większość programów w jakiś sposób używa lub umożliwia korzystanie z Internetu. Ponieważ ogólnoświatowa pajęczyna jest duża i niejednorodna, to tworzenie oprogramowania, które odpowiada takim wymaganiom, stało się trudne.
Odpowiedzią firmy Microsoft na rosnące wymagania użytkowników i programistów jest platforma .NET. Niniejszy artykuł otwiera serię 10 publikacji (liczba ta może się jeszcze w niewielkim stopniu zmienić) na temat jednego z istotniejszych aspektów tego środowiska - tworzenia aplikacji internetowych przy użyciu ASP .NET, nowoczesnego rozwinięcia znanej już od wielu lat technologii ASP.
Projektowanie i budowanie aplikacji internetowych jest bardzo szerokim zagadnieniem, obejmującym tematy związane z tworzeniem interfejsu, obsługą żądań użytkowników, korzystaniem z bazy danych, zabezpieczeniami i współpracą różnych systemów. Pierwszy odcinek kursu ASP .NET jest poświęcony przede wszystkim wprowadzeniu do technologii .NET i zawiera podstawowe informacje niezbędne do odnalezienia się w tym bogatym i złożonym środowisku.
Według definicji Microsoftu, .NET jest oprogramowaniem łączącym informacje, ludzi, systemy i urządzenia. Obejmuje ono narzędzia klienckie, serwery oraz środowiska programistyczne i składa się z następujących elementów:
§ Środowiska .NET Framework (aktualnie w wersji 1.1), używanego do tworzenia i uruchamiania dowolnego typu programów,
§ Narzędzi programistycznych takich jak Visual Studio .NET 2003 czy darmowy Web Matrix,
§ Zestawu serwerów - w tym Microsoft Windows Server 2003, Microsoft SQL Server 2000 i Microsoft BizTalk Server - które wspólnie tworzą platformę integracji, działania i zarządzania usługami XML Web Services oraz aplikacjami internetowymi,
§ Oprogramowania klienckiego - na przykład Windows XP, Windows CE i Microsoft Office XP.
.NET Framework jest podstawowym składnikiem niezbędnym do tworzenia i uruchamiania aplikacji i usług działających na platformie .NET. Można w nim tworzyć dowolne oprogramowanie: aplikacje desktopowe, usługi systemowe, aplikacje internetowe, aplikacje dla urządzeń przenośnych, usługi XML Web Services (komponenty umożliwiające integrację różnych systemów - współdzielenie danych i funkcjonalności za pośrednictwem sieci i zestawu standardowych, niezależnych od platformy protokołów takich jak XML, SOAP i HTTP) itp.
Środowisko .NET Framework nie jest związane z żadnym konkretnym językiem programowania - obecnie obsługuje ich ponad 20 (C++, C#, Visual Basic, J# - produkowane przez Microsoft - oraz Fortran, Pascal, Perl, Python, COBOL, SmallTalk i inne - innych producentów). Liczba ta może się oczywiście jeszcze zwiększyć. Zadaniem .NET Framework jest zarządzanie przeróżnymi elementami systemu, których obsługa do tej pory zajmowała programistom najwięcej czasu. Dzięki temu twórcy oprogramowania mogą skupić się na dostarczaniu konkretnej funkcjonalności, nie tracąc energii na przykład na zarządzanie pamięcią lub obsługę komunikacji procesów działających w środowisku rozproszonym.
Jak widać na rysunku, Common Language Runtime (CLR) jest podstawowym komponentem .NET Framework. Pod jego kontrolą są wykonywane wszystkie korzystające z tej platformy aplikacje. Do usług CLR zaliczają się:
§ Zarządzanie kodem (uruchamianie i nadzór nad jego wykonywaniem),
§ Izolowanie obszarów pamięci przydzielonych poszczególnym aplikacjom,
§ Weryfikacja zgodności typów,
§ Konwersja języka pośredniego IL do kodu natywnego (maszynowego),
§ Dostęp do metadanych (rozszerzonej informacji o typach),
§ Zarządzanie pamięcią (w przypadku obiektów zarządzanych),
§ Stosowanie zabezpieczeń dostępu kodu do zasobów,
§ Obsługa wyjątków i przekazywanie ich pomiędzy różnymi językami programowania,
§ Obsługa współpracy pomiędzy kodem zarządzanym, obiektami COM i starszymi bibliotekami DLL,
§ Automatyzacja tworzenia obiektow,
§ Usługi związane z tworzeniem oprogramowania (debugowanie, profilowanie itp.)
Niektóre z pojęć, które pojawiły się na powyższej liście, zostaną wyjaśnione szczegółowo w dalszej części tekstu.
Wspólny system typów (ang. Common Type System)Typ informuje w jaki sposób należy interpretować dane i co można z nimi zrobić. Przykładowo, typ String oznacza łańcuch znaków. Z definicją typu związany jest zestaw operacji, które można na nim wykonać - dla typu String będzie to na przykład kopiowanie fragmentu łańcucha, zamiana fragmentów tekstu itp.
Typy danych występują w większości nowoczesnych języków programowania, jednak .NET Framework wprowadza coś więcej: wspólny dla wszystkich języków programowania system typów, określany jako CTS (Common Type System). Dzięki temu, że wszystkie języki platformy .NET dzielą jeden wspólny system typów, mogą one korzystać wzajemnie ze swoich danych i w pełni się integrować.
Język pośredni IL (ang. Intermediate Language)Microsoft Intermediate Language (MSIL) jest niezależnym od procesora zestawem rozkazów, do którego kompilowane są wszystkie programy korzystające ze środowiska .NET. Zawiera on instrukcje niezbędne do ładowania, przechowywania i inicjalizowania obiektów oraz do wywoływania ich metod. Wraz z metadanymi i wspólnym systemem typów, MSIL pozwala na pełną integrację pomiędzy różnymi językami programowania.
Kod skompilowany do języka IL przyjmuje postać zwyczajnie wyglądającego pliku EXE lub DLL. Po uruchomieniu któregoś z nich, specjalny proces kompiluje kod IL na kod maszynowy. Operacja ta nie jest jednak przeprowadzana na raz dla całej aplikacji, lecz jedynie dla potrzebnych w danej chwili fragmentów - dlatego jest nazywana kompilacją na żądanie (Just-In-Time Compilation). Raz skompilowane fragmenty są przechowywane i mogą być wykorzystane bezpośrednio przy kolejnym użyciu.
Dodatkowo możliwe jest skorzystanie z kompilacji podczas instalacji - polega ona na jednorazowym przetłumaczeniu całego podzespołu (patrz dalej) na kod maszynowy i zachowanie tego kodu na dysku komputera. Dzięki temu rozwiązaniu duże aplikacje mogą uruchamiać się szybciej i nie zużywać zasobów systemowych na wywoływanie kompilatora JIT.
Kod zarządzany (ang. managed code) i dane zarządzaneKod zarządzany jest to kod zgodny ze specyfikacją CLR. Wymaga ona, aby oprogramowanie udostępniało CLR pewne podstawowe informacje na swój temat (metadane).
Kod zarządzany może w pełni korzystać z możliwości udostępnianych przez .NET Framework - takich jak automatyczne zarządzanie pamięcią, przezroczysta współpraca fragmentów oprogramowania napisanych w różnych językach programowania, czy też zarządzanie uprawnieniami. Kod pisany w języku C# lub Visual Basic .NET jest domyślnie kodem zarządzanym, natomiast w przypadku C++ .NET wymaga to dodatkowych zabiegów.
Pojęciem pokrewnym do kodu zarządzanego są zarządzane dane - wyróżniają się one tym, że są alokowane i zwalniane przez proces odśmiecający działający w ramach CLR.
Proces odśmiecający (ang. garbage collector)Odśmiecanie pamięci jest mechanizmem pozwalającym na wykrycie obiektów, które nie będą już używane przez aplikację. Podczas odśmiecania zajmowana przez te obiekty pamięć jest automatycznie zwalniana, a ponadto wywoływane są finalizatory, czyli przygotowane przez użytkownika fragmenty kodu mające na celu poprawne zwolnienie wszystkich związanych z obiektem zasobów (np. połączeń z bazą danych). Proces odśmiecający wbudowany w .NET Framework potrafi także kompaktować pamięć (tj. przesuwać zajęte obszary w nowo zwolnione miejsca), dzięki czemu zmniejsza się tzw. zestaw roboczy aplikacji - czyli całkowity używany przez nią blok pamięci.
Podzespoły (ang. assembly)Podzespoły są podstawowymi blokami z jakich buduje się aplikacje .NET - są to skompilowane, opatrzone numerem wersji i stanowiące spójną całość pakiety udostępniające określoną funkcjonalność. Każdy z zarządzanych typów posiada znacznik określający czy może być on używany jedynie przez typy znajdujące się w tym samym podzespole, czy również spoza niego.Ważną cechą podzespołów jest to, że są one samoopisujące - ich integralną częścią jest tzw. manifest, który:
§ Określa tożsamość podzespołu (czyli jego nazwę), numer wersji i kulturę (informacje o regionach i językach obsługiwanych przez podzespół),
§ Zawiera podpis cyfrowy podzespołu (tylko jeżeli podzespół ma być używany przez różne aplikacje),
§ Wymienia składające się na podzespół pliki,
§ Wymienia typy i zasoby składające się na podzespół, wraz z informacją, które z nich są eksportowane,
§ Zawiera informacje o powiązaniach z innymi podzespołami,
§ Określa zestaw uprawnień niezbędnych do poprawnego działania podzespołu.
Informacje zawarte w manifeście są używane podczas uruchamiania podzespołu do weryfikacji jego integralności oraz rozpoznawania powiązań z innymi podzespołami i kontroli wersji. Ponadto, podzespół stanowi jednostkę, w obrębie której są stosowane uprawnienia dla kodu wykonywalnego. W przypadku aplikacji składającej się z kilku podzespołów, dla każdego z nich osobno określane są dozwolone operacje.
Zdolność podzespołów do samoopisywania się pozwala na znaczne uproszczenie instalacji aplikacji - w przypadku .NET sprowadza się ona do prostego skopiowania plików do katalogu docelowego. Podzespoły mogą być używane jako prywatne albo współdzielone. W pierwszym przypadku podzespół jest używany przez jedna tylko aplikację i znajduje się w jej katalogu na dysku komputera. Aby udostępnić podzespół do użytku przez inne aplikacje, należy nadać mu tzw. silną nazwę (ang. strong name), której globalna unikalność jest gwarantowana przez zastosowane techniki kryptograficzne.
Wykorzystanie wpółdzielonych podzespołów pozwala m. in. na zachowanie kontroli nad kolejnymi ich wersjami. Ponieważ do wyznaczenia silnej nazwy podzespołu używane są metody kryptograficzne, to tylko jego autor posiada odpowiedni klucz prywatny i tylko on jest w stanie wyprodukować nową jego wersję. Zabezpiecza to przed podmianą podzespołu na nowy, pochodzący z niewiadomego źródła.
Podzespoły współdzielone są zazwyczaj instalowane w tzw. globalnym cache podzespołów (global assembly cache - GAC) umiejscowionym domyślnie w podkatalogu assembly katalogu systemowego. Wszystkie klasy dostarczane wraz z platformą .NET Framework są skompilowane do postaci podzespołów współdzielonych.
Domena aplikacji (ang. application domain)Domena aplikacji jest wirtualnym procesem, którego zadaniem jest izolowanie od siebie poszczególnych aplikacji .NET. Wszystkie obiekty tworzone w obrębie jednej aplikacji są tworzone w tej samej domenie. W jednym rzeczywistym procesie systemu operacyjnego może istnieć wiele domen aplikacji, co jest znacznie mniej kosztowne niż tworzenie oddzielnego procesu dla każdej aplikacji. Ma to znaczenie szczególnie w przypadku dużych serwerów Web. CLR zarządza wykorzystaniem pamięci przez kod działający w obrębie domeny aplikacji i pilnuje, aby nie korzystał on z obszarów znajdujących się poza jej granicami.
Biblioteka klas .NET Framework składa się z klas, interfejsów i stałych, które są zawarte w pakiecie Microsoft .NET Framework SDK. Elementy biblioteki klas .NET Framework, pogrupowane za pomocą hierarchicznej struktury przestrzeni nazw (ang. namespace), umożliwiają dostęp do usług systemowych i zostały zaprojektowane tak, aby stanowiły podstawę do tworzenia aplikacji, komponentów i kontrolek .NET. Zadaniem przestrzeni nazw jest zawężenie zakresu, w którym obowiązują nazwy typów - w aplikacji mogą istnieć np. dwie klasy o tej samej nazwie pod warunkiem, że są zdefiniowane w różnych przestrzeniach nazw. Kolejne poziomy hierarchii przestrzeni nazw są oddzielone znakiem kropki. Nazwy przestrzeni nazw dostarczanych przez firmę Microsoft zawsze zaczynają się od etykiety System lub Microsoft.
Poniżej wymieniono najczęściej używane i najbardziej przydatne przestrzenie nazw znajdujące się w bibliotece klas .NET Framework. z punktu widzenia niniejszego kursu największe znaczenie ma przestrzeń nazw System.Web, jednakże warto zapoznać się również z innymi elementami biblioteki klas:
Przestrzeń nazw
Opis
Microsoft.CSharp
Zawiera klasy obsługujące kompilację i generowanie kodu przy użyciu języka programowania C#.
Microsoft.JScript
Zawiera klasy obsługujące kompilację i generowanie kodu przy użyciu języka programowania JScript.
Microsoft.VisualBasic
Zawiera klasy obsługujące kompilację i generowanie kodu przy użyciu języka programowania Visual Basic .NET.
Microsoft.Win32
Zawiera dwa rodzaje klas: obsługujące zdarzenia wyzwalane przez system operacyjny oraz pozwalające na manipulowanie rejestrem systemowym.
System
Zawiera podstawowe klasy oraz klasy bazowe, które definiują najczęściej używane ty...
piotrek_r