You are on page 1of 44

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

C# i .NET
Autor: Stephen C. Perry
Tumaczenie: Mikoaj Szczepaniak (przedmowa, rozdz.
1 10), Tomasz Walczak (rozdz. 11 18, dod. A, B)
ISBN: 83-246-0320-4
Tytu oryginau: Core C# and .NET
Format: B5, stron: 912

Doskonae rdo wiedzy dla wszystkich programistw C#


Szczegowe omwienie C# i .NET w wersji 2.0
Techniki tworzenia i zabezpieczania aplikacji oraz zarzdzania kodem
rdowym i wersjami
Dziesitki przykadw i kodw rdowych
Platforma .NET i jzyk C# spowodoway prawdziw rewolucj na rynku narzdzi
programistycznych. Wersja 2.0 przyniosa kilka interesujcych rozwiza, w tym
nowe typy danych, komponenty i klasy. Dodatkowe funkcje jzyka C# pozwalaj
na przyspieszenie i usprawnienie procesu tworzenia aplikacji oraz jej wdraania
i rozwijania. Dziki platformie .NET przygotowanie wydajnej, bezpiecznej i atwej
do rozbudowy aplikacji stao si znacznie prostsze i szybsze.
Ksika C# i .NET przedstawia moliwoci platformy .NET i napisanego specjalnie
dla niej jzyka C#. Opisuje elementy platformy, skadni i moliwoci jzyka C# oraz
zagadnienia zwizane z tworzeniem programw za pomoc tych narzdzi. Omawia
zasady pisania aplikacji Window Forms i efektywne techniki stosowania klas
graficznych z biblioteki GDI+. Charakteryzuje take technologi ADO.NET, metody
korzystania z plikw XML, przetwarzanie wielowtkowe oraz techniki tworzenia
wydajnych aplikacji internetowych w technologii ASP.NET. Szczegln uwag
powicono bezpieczestwu programw i danych oraz skalowaniu i lokalizacji
oprogramowania.
Elementy platformy .NET
Podstawy jzyka C#
Praca z klasami i obiektami w C#
Przetwarzanie tekstu oraz operacje wejcia i wyjcia
Tworzenie aplikacji Window Forms
Korzystanie z biblioteki GDI+
Poczenia z bazami danych za pomoc ADO.NET
Aplikacje wielowtkowe oraz rozproszone
Tworzenie aplikacji internetowych
Jeli chcesz napisa w C# aplikacj dobrej jakoci, signij po t ksik

O autorze ....................................................................................................................................................17
Podzikowania ...........................................................................................................................................18
Sowo wstpne ...........................................................................................................................................19
Przedmowa ................................................................................................................................................21

Cz I Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET 25


Rozdzia 1. Wprowadzenie do technologii .NET i jzyka C# .................................................................... 27
1.1. Przegld skadnikw platformy .NET ...................................................................... 28
Microsoft .NET i standardy CLI ............................................................................. 30
1.2. Wsplne rodowisko uruchomieniowe (CLR) .......................................................... 32
Kompilacja kodu platformy .NET ........................................................................... 32
Wsplny system typw (CTS) ................................................................................ 34
Zestawy .NET ...................................................................................................... 36
1.3. Biblioteka klas platformy (FCL) ............................................................................. 41
1.4. Praca z platform .NET i zestawem narzdzi .NET Framework SDK .......................... 44
Aktualizowanie platformy .NET Framework ............................................................. 45
Narzdzia platformy .NET Framework .................................................................... 46
Ildasm.exe .......................................................................................................... 47
wincv.exe ........................................................................................................... 50
Narzdzie Framework Configuration ...................................................................... 50
1.5. Wyjanienie dziaania kompilatora C# ................................................................... 53
Lokalizowanie kompilatora ................................................................................... 53
Kompilowanie oprogramowania z poziomu wiersza polece ..................................... 54
1.6. Podsumowanie ................................................................................................... 57
1.7. Sprawd, czego si nauczye .............................................................................. 57

Rozdzia 2. Podstawy jzyka C# ............................................................................................................. 59


2.1. Podstawowa struktura programu C# ...................................................................... 60
Oglne uwagi odnonie programowania w jzyku C# ............................................... 62
2.2. Typy proste ......................................................................................................... 65
decimal .............................................................................................................. 67
bool ................................................................................................................... 67

C# i .NET
char ................................................................................................................... 67
byte, sbyte .......................................................................................................... 68
short, int, long .................................................................................................... 68
single i double .................................................................................................... 68
Konwertowanie acuchw numerycznych za pomoc metod Parse() i TryParse() ....... 69
2.3. Operatory arytmetyczne, logiczne i warunkowe ........................................................ 69
Operatory arytmetyczne ........................................................................................ 69
Operatory warunkowe i relacyjne ........................................................................... 70
Instrukcje kontrolujce przepyw sterowania .......................................................... 71
if-else ................................................................................................................. 71
switch ................................................................................................................ 73
2.4. Ptle .................................................................................................................. 74
Ptla while .......................................................................................................... 74
Ptla do ............................................................................................................. 74
Ptla for ............................................................................................................. 75
Ptla foreach ...................................................................................................... 75
Kontrola przepywu sterowania w ptlach .............................................................. 76
2.5. Dyrektywy preprocesora C# .................................................................................. 76
Kompilacja warunkowa ........................................................................................ 77
Dyrektywy diagnostyczne ...................................................................................... 79
Regiony (obszary) kodu ........................................................................................ 79
2.6. acuchy znakw ................................................................................................ 79
Stae acuchowe ................................................................................................ 80
Operacje na acuchach ....................................................................................... 81
2.7. Typy wyliczeniowe ................................................................................................ 84
Praca z typami wyliczeniowymi .............................................................................. 84
Metody klasy System.Enum ................................................................................. 85
Typy wyliczeniowe i flagi bitowe ............................................................................ 86
2.8. Tablice ............................................................................................................... 87
Deklarowanie i tworzenie tablic ............................................................................. 88
Stosowanie metod i waciwoci tablicy System.Array ............................................ 88
2.9. Typy referencyjne i wartociowe ............................................................................ 90
Klasy System.Object i System.ValueType .............................................................. 90
Techniki przydzielania pamici dla typw referencyjnych i typw wartociowych ........ 91
Technika pakowania ............................................................................................ 92
Podsumowanie rnic pomidzy typami wartociowymi a typami referencyjnymi ........ 94
2.10. Podsumowanie ................................................................................................... 95
2.11. Sprawd, czego si nauczye .............................................................................. 95

Rozdzia 3. Projektowanie klas w jzyku C# ......................................................................................... 97


3.1. Wprowadzenie do klas jzyka C# .......................................................................... 98
3.2. Definiowanie klas ................................................................................................ 98
Atrybuty .............................................................................................................. 99
Modyfikatory dostpu ........................................................................................ 102
Modyfikatory abstract, sealed i static .................................................................. 102
Identyfikator klasy ............................................................................................. 103
Klasy bazowe, interfejsy i dziedziczenie ............................................................... 103
3.3. Przegld skadowych klasy ................................................................................. 104
Modyfikatory dostpu do skadowych .................................................................. 104
3.4. Stae, pola i waciwoci .................................................................................... 104
Stae ................................................................................................................ 106
Pola ................................................................................................................. 107

Spis treci

Waciwoci ...................................................................................................... 109


Indeksery ......................................................................................................... 111
3.5. Metody ............................................................................................................. 113
Modyfikatory metod ........................................................................................... 113
Przekazywanie parametrw ................................................................................. 118
3.6. Konstruktory ..................................................................................................... 120
Konstruktor instancji ......................................................................................... 120
Konstruktor prywatny ......................................................................................... 124
Konstruktor statyczny ........................................................................................ 125
3.7. Delegacje i zdarzenia ......................................................................................... 126
Delegacje ......................................................................................................... 127
Obsuga zdarze z wykorzystaniem delegacji ........................................................ 129
3.8. Przecianie operatorw .................................................................................... 136
3.9. Interfejsy .......................................................................................................... 139
Tworzenie i stosowanie interfejsw niestandardowych .......................................... 139
Praca z interfejsami ........................................................................................... 142
3.10. Klasy uniwersalne ............................................................................................. 143
3.11. Struktury .......................................................................................................... 146
Definiowanie struktur ......................................................................................... 147
Stosowanie struktur z metodami i waciwociami ............................................... 148
3.12. Struktury kontra klasy ....................................................................................... 149
Struktury s typami wartociowymi, klasy s typami referencyjnymi ....................... 149
W przeciwiestwie do klas struktury nie mog by dziedziczone ............................ 150
Oglne reguy, ktre naley uwzgldnia,
wybierajc pomidzy strukturami a klasami ....................................................... 150
3.13. Podsumowanie ................................................................................................. 151
3.14. Sprawd, czego si nauczye ............................................................................ 151

Rozdzia 4. Praca z obiektami w jzyku C# ...........................................................................................155


4.1. Tworzenie obiektw ........................................................................................... 156
Przykad: Tworzenie obiektw za pomoc wielu klas fabrykujcych ......................... 158
4.2. Obsuga wyjtkw .............................................................................................. 159
Klasa System.Exception .................................................................................... 160
Pisanie kodu obsugujcego wyjtki .................................................................... 160
Przykad: Obsuga wsplnych wyjtkw SystemException ...................................... 163
Tworzenie niestandardowych klas wyjtkw ......................................................... 164
Wyjtki nieobsugiwane ...................................................................................... 167
Wskazwki dotyczce obsugi wyjtkw ............................................................... 168
4.3. Implementowanie metod klasy System.Object w klasach niestandardowych ........... 170
Metoda ToString() jako narzdzie opisywania obiektw ......................................... 170
Metoda Equals() jako narzdzie porwnywania obiektw ....................................... 172
Klonowanie jako sposb tworzenia kopii obiektw ................................................ 174
4.4. Praca z klasami i interfejsami kolekcji technologii .NET ........................................ 176
Interfejsy kolekcji .............................................................................................. 176
Przestrze nazw System.Collections ................................................................... 185
Klasy Stack i Queue .......................................................................................... 185
Klasa ArrayList .................................................................................................. 187
Klasa Hashtable ............................................................................................... 188
Przestrze nazw System.Collections.Generic ....................................................... 191
4.5. Serializacja obiektw ......................................................................................... 195
Serializacja binarna ........................................................................................... 195

C# i .NET
4.6. Zarzdzanie cyklem ycia obiektw ..................................................................... 199
Odzyskiwanie pamici w technologii .NET ............................................................ 199
4.7. Podsumowanie .................................................................................................. 205
4.8. Sprawd, czego si nauczye ............................................................................. 205

Cz II Tworzenie aplikacji z wykorzystaniem biblioteki klas platformy


.NET Framework

207

Rozdzia 5. Przetwarzanie tekstu i plikowe operacje wejcia-wyjcia w jzyku C# ......................209


5.1. Znaki i format Unicode ....................................................................................... 210
Format Unicode ................................................................................................. 211
Praca ze znakami .............................................................................................. 212
5.2. Klasa String ...................................................................................................... 215
Tworzenie acuchw ......................................................................................... 216
Przegld operacji na acuchach znakowych ........................................................ 218
5.3. Porwnywanie acuchw znakowych .................................................................. 219
Stosowanie metody String.Compare() ................................................................. 219
Stosowanie metody String.CompareOrdinal() ....................................................... 221
5.4. Przeszukiwanie, modyfikowanie i kodowanie zawartoci acuchw ....................... 222
Przeszukiwanie zawartoci acuchw ................................................................. 222
Przeszukiwanie acuchw zawierajcych pary zastpcze ...................................... 222
Przeksztacanie acuchw ................................................................................. 223
Kodowanie acuchw ....................................................................................... 225
5.5. Klasa StringBuilder ............................................................................................ 226
Przegld skadowych klasy StringBuilder .............................................................. 227
Konkatenacja w klasie StringBuilder kontra tradycyjna konkatenacja acuchw ..... 228
5.6. Formatowanie wartoci liczbowych oraz daty i godziny .......................................... 229
Konstruowanie elementw formatowania ............................................................ 230
Formatowanie wartoci liczbowych ...................................................................... 231
Formatowanie daty i godziny ............................................................................... 231
5.7. Wyraenia regularne .......................................................................................... 236
Klasa Regex ..................................................................................................... 237
Tworzenie wyrae regularnych ........................................................................... 242
Przykad dopasowywania wzorca do acucha ...................................................... 242
Praca z grupami ................................................................................................ 245
Przykady stosowania wyrae regularnych ........................................................... 247
5.8. Przestrze nazw System.IO klasy obsugujce odczytywanie i zapisywanie
strumieni danych ............................................................................................... 248
Klasa Stream .................................................................................................... 249
Klasa FileStream ............................................................................................... 249
Klasa MemoryStream ........................................................................................ 251
Klasa BufferedStream ....................................................................................... 252
Stosowanie klas StreamReader i StreamWriter odpowiednio do odczytywania
i zapisywania wierszy tekstu ............................................................................. 253
Klasy StringWriter i StringReader ........................................................................ 255
Szyfrowanie danych za pomoc klasy CryptoStream ............................................. 256
5.9. Przestrze nazw System.IO katalogi i pliki ....................................................... 259
Klasa FileSystemInfo ......................................................................................... 259
Praca z katalogami za pomoc klas DirectoryInfo, Directory oraz Path .................... 260
Praca z plikami za pomoc klas FileInfo i File ....................................................... 263
5.10. Podsumowanie ................................................................................................. 265
5.11. Sprawd, czego si nauczye ............................................................................ 266

Spis treci

Rozdzia 6. Budowanie aplikacji Windows Forms .................................................................................269


6.1. Programowanie aplikacji Windows Forms ............................................................. 270
Rczne konstruowanie aplikacji Windows Forms .................................................. 271
6.2. Klasy kontrolek przestrzeni nazw Windows.Forms ................................................ 274
Klasa Control .................................................................................................... 274
Praca z kontrolkami ........................................................................................... 276
Zdarzenia zwizane z kontrolkami ....................................................................... 281
6.3. Klasa Form ....................................................................................................... 286
Konfigurowanie wygldu formularza ..................................................................... 288
Ustawianie pooenia i rozmiaru formularza ......................................................... 291
Wywietlanie formularzy ..................................................................................... 292
Cykl ycia formularza niemodalnego .................................................................... 293
Wzajemne oddziaywanie formularzy przykad prostej aplikacji ........................... 295
Formularz waciciela i formularze wasnoci ....................................................... 298
Okna komunikatw i okna dialogowe ................................................................... 300
Formularze MDI ................................................................................................. 302
6.4. Praca z menu .................................................................................................... 306
Waciwoci klasy MenuItem .............................................................................. 306
Menu kontekstowe ............................................................................................ 307
6.5. Dodawanie pomocy do formularza ...................................................................... 308
Podpowiedzi ...................................................................................................... 309
Obsuga zdarze nacinicia klawisza F1 i kliknicia przycisku Pomoc ................... 310
Komponent HelpProvider .................................................................................... 312
6.6. Dziedziczenie formularzy .................................................................................... 313
Konstruowanie i korzystanie z bibliotek formularzy ............................................... 313
Korzystanie z formularzy potomnych .................................................................... 314
6.7. Podsumowanie .................................................................................................. 315
6.8. Sprawd, czego si nauczye ............................................................................. 316

Rozdzia 7. Kontrolki formularzy Windows Forms ...............................................................................317


7.1. Przegld dostpnych w technologii .NET kontrolek formularzy Windows Forms ........ 318
7.2. Klasy przyciskw, grup kontrolek, paneli i etykiet ................................................. 321
Klasa Button ..................................................................................................... 321
Klasa CheckBox ................................................................................................ 323
Klasa RadioButton ............................................................................................ 324
Klasa GroupBox ................................................................................................ 325
Klasa Panel ...................................................................................................... 326
Klasa Label ...................................................................................................... 328
7.3. Kontrolki PictureBox i TextBox ............................................................................ 329
Klasa PictureBox ............................................................................................... 329
Klasa TextBox ................................................................................................... 331
7.4. Klasy ListBox, CheckedListBox i ComboBox ......................................................... 333
Klasa ListBox .................................................................................................... 333
Pozostae kontrolki list: ComboBox i CheckedListBox ........................................... 338
7.5. Klasy ListView i TreeView ................................................................................... 339
Klasa ListView .................................................................................................. 339
Klasa TreeView ................................................................................................. 346
7.6.Klasy ProgressBar, Timer i StatusStrip ................................................................ 351
Konstruowanie obiektw kontrolek StatusStrip .................................................... 351
7.7. Konstruowanie kontrolek niestandardowych ........................................................ 353
Rozbudowa istniejcej kontrolki .......................................................................... 354
Budowa niestandardowej kontrolki uytkownika ................................................... 354

10

C# i .NET
Przykad kontrolki UserControl ............................................................................ 355
Stosowanie niestandardowych kontrolek uytkownika ........................................... 356
Praca z kontrolkami uytkownika na etapie projektowania aplikacji ........................ 357
7.8. Stosowanie techniki przecigania i upuszczania
w kontrolkach formularzy WinForms ................................................................... 358
Wprowadzenie do techniki przecigania i upuszczania .......................................... 358
7.9. Korzystanie z zasobw ....................................................................................... 364
Praca z plikami zasobw .................................................................................... 364
Stosowanie plikw zasobw w procesie tworzenia formularzy obsugujcych
wiele jzykw .................................................................................................. 368
7.10. Podsumowanie ................................................................................................. 371
7.11. Sprawd, czego si nauczye ............................................................................ 371

Rozdzia 8. Elementy graficzne biblioteki GDI+ w technologii .NET ......................................................373


8.1. Przegld biblioteki GDI+ ..................................................................................... 374
Klasa Graphics ................................................................................................. 375
Zdarzenie Paint ................................................................................................. 379
8.2. Uywanie obiektw klasy Graphics ...................................................................... 382
Podstawowe operacje grafiki dwuwymiarowej ....................................................... 383
Pira ................................................................................................................ 387
Pdzle .............................................................................................................. 389
Kolory .............................................................................................................. 393
Przykadowy projekt: budowa przegldarki kolorw ............................................... 396
8.3. Obrazy .............................................................................................................. 400
Wczytywanie i zapisywanie obrazw .................................................................... 400
Operacje na obrazach ........................................................................................ 403
Przykadowy projekt: praca z obrazami ................................................................. 406
Uwaga odnonie biblioteki GDI i BitBlt dla platformy Microsoft Windows ................ 412
8.4. Podsumowanie .................................................................................................. 413
8.5. Sprawd, czego si nauczye ............................................................................. 414

Rozdzia 9. Czcionki, tekst i techniki drukowania .................................................................................417


9.1. Czcionki ........................................................................................................... 418
Rodziny czcionek ............................................................................................... 419
Klasa Font ........................................................................................................ 420
9.2. Rysowanie acuchw tekstowych ....................................................................... 424
Rysowanie tekstu wielowierszowego ................................................................... 424
Formatowanie acuchw za pomoc klasy StringFormat ...................................... 425
Stosowanie pozycji tabulacyjnych ........................................................................ 425
Przycinanie, wyrwnywanie i zawijanie acuchw ................................................. 428
9.3. Drukowanie ....................................................................................................... 429
Wprowadzenie ................................................................................................... 430
Klasa PrintDocument ......................................................................................... 431
Ustawienia drukarki ........................................................................................... 431
Ustawienia strony .............................................................................................. 434
Zdarzenia PrintDocument ................................................................................... 435
Zdarzenie PrintPage ........................................................................................... 437
Podgld raportu przeznaczonego do wydrukowania ............................................... 438
Przykad raportu ................................................................................................ 439
Tworzenie niestandardowych klas potomnych wzgldem klasy PrintDocument ........ 443
9.4. Podsumowanie .................................................................................................. 445
9.5. Sprawd, czego si nauczye ............................................................................. 446

Spis treci

11

Rozdzia 10. Praca z formatem XML w technologii .NET .......................................................................447


10.1. Praca z formatem XML ....................................................................................... 448
Tworzenie dokumentw XML za pomoc mechanizmu serializacji do formatu XML .. 449
Definicja schematu XML (XSD) ........................................................................... 452
Stosowanie arkuszy stylw XML .......................................................................... 454
10.2. Techniki odczytu danych w formacie XML ............................................................ 457
Klasa XmlReader ............................................................................................... 458
Klasa XmlNodeReader ....................................................................................... 463
Klasa XmlReaderSettings ................................................................................... 464
Weryfikacja danych XML z wykorzystaniem schematu XML .................................... 464
Opcje zwizane z odczytem danych XML .............................................................. 466
10.3. Techniki zapisywania danych w formacie XML ...................................................... 466
10.4. Przeszukiwanie kodu XML za pomoc instrukcji jzyka XPath ................................ 469
Konstruowanie zapyta jzyka XPath ................................................................... 470
Klasa XmlDocument i instrukcje jzyka XPath ...................................................... 473
Klasa XPathDocument i instrukcje jzyka XPath ................................................... 473
Klasa XmlDataDocument i instrukcje jzyka XPath ............................................... 474
10.5. Podsumowanie .................................................................................................. 476
10.6. Sprawd, czego si nauczye ............................................................................. 477

Rozdzia 11. ADO.NET ................................................................................................................................479


11.1. Architektura ADO.NET ........................................................................................ 480
Dostawca danych OLE DB w .NET ....................................................................... 481
Dostawca danych .NET ...................................................................................... 481
11.2. Modele dostpu do danych poczeniowy i bezpoczeniowy ............................. 483
Model poczeniowy .......................................................................................... 484
Model bezpoczeniowy ..................................................................................... 485
11.3. Model poczeniowy ADO.NET ............................................................................ 487
Klasy do obsugi poczenia ............................................................................... 487
Obiekt polecenia ............................................................................................... 490
Obiekt DataReader ............................................................................................ 494
11.4. Klasy DataSet, DataTable i model bezpoczeniowy ............................................. 497
Klasa DataSet .................................................................................................. 497
Kolekcja DataTable ........................................................................................... 497
adowanie danych do obiektu DataSet ................................................................ 501
Uywanie obiektu DataAdapter do aktualizacji bazy danych ................................... 503
Definiowanie relacji midzy tabelami w obiekcie DataSet ...................................... 506
Wybr midzy modelem poczeniowym a bezpoczeniowym ................................ 509
11.5. XML i ADO.NET ................................................................................................. 509
Uywanie obiektw DataSet do tworzenia plikw z danymi i szablonami XML .............. 510
Tworzenie szablonu obiektu DataSet na podstawie pliku XML ............................... 512
Wczytywanie danych XML do obiektu DataSet ...................................................... 512
11.6. Podsumowanie .................................................................................................. 515
11.7. Sprawd, czego si nauczye ............................................................................. 515

Rozdzia 12. Wizanie danych z kontrolkami Windows Forms .............................................................517


12.1. Wprowadzenie do wizania danych ..................................................................... 518
Proste wizanie danych ...................................................................................... 518
Zoone wizanie danych z kontrolkami obsugujcymi listy ................................... 520
Jednostronne i dwustronne wizanie danych ........................................................ 521
Uycie menederw wizania .............................................................................. 523

12

C# i .NET
12.2. Uywanie prostego i zoonego wizania danych w aplikacjach .............................. 526
Wizanie z obiektem DataTable .......................................................................... 526
Wizanie kontrolek z obiektem ArrayList .............................................................. 528
Dodawanie elementw do rda danych ............................................................. 530
Identyfikacja aktualizacji .................................................................................... 531
Aktualizacja oryginalnej bazy danych ................................................................... 532
12.3. Klasa DataGridView ........................................................................................... 532
Waciwoci ...................................................................................................... 532
Zdarzenia ......................................................................................................... 539
Ustawianie relacji nadrzdna-szczegowa w kontrolkach DataGridView .................. 543
Tryb wirtualny .................................................................................................... 545
12.4. Podsumowanie .................................................................................................. 550
12.5. Sprawd, czego si nauczye ............................................................................. 550

Cz III Zaawansowane techniki jezyka C# i platformy .NET

553

Rozdzia 13. Programowanie asynchroniczne i wielowtkowo ......................................................555


13.1. Czym jest wtek? .............................................................................................. 556
Wielowtkowo ................................................................................................ 556
13.2. Programowanie asynchroniczne .......................................................................... 559
Delegacje asynchroniczne .................................................................................. 560
Przykady implementacji wywoa asynchronicznych .............................................. 563
13.3. Bezporednie uywanie wtkw .......................................................................... 571
Tworzenie i uywanie wtkw .............................................................................. 571
Praktyczne wykorzystanie wielowtkowoci .......................................................... 574
Uywanie puli wtkw ........................................................................................ 577
Klasy Timer ....................................................................................................... 578
13.4. Synchronizacja wtkw ...................................................................................... 580
Atrybut Synchronization ...................................................................................... 582
Klasa Monitor ................................................................................................... 583
Muteksy ........................................................................................................... 584
Semafory .......................................................................................................... 585
Unikanie zakleszczenia ...................................................................................... 587
Podsumowanie technik synchronizacji ................................................................. 588
13.5. Podsumowanie .................................................................................................. 589
13.6. Sprawd, czego si nauczye ............................................................................. 590

Rozdzia 14. Tworzenie aplikacji rozproszonych za pomoc technologii Remoting ..........................593


14.1. Domeny aplikacji ............................................................................................... 594
Zalety domen aplikacji ....................................................................................... 594
Domeny aplikacji i zestawy ................................................................................. 595
Uywanie klasy AppDomain ................................................................................ 596
14.2. Zdalne korzystanie z obiektw ............................................................................ 598
Architektura technologii Remoting ....................................................................... 600
Rodzaje wywoa zdalnych .................................................................................. 603
Obiekty aktywowane przez klienta ....................................................................... 604
Obiekty aktywowane przez serwer ....................................................................... 605
Rejestracja typw .............................................................................................. 606
Zdalne wywoania obiektw aktywowanych przez serwer ....................................... 609
Zdalne wywoywanie obiektw aktywowanych przez klienta .................................... 616
Projektowanie aplikacji rozproszonych ................................................................. 621

Spis treci

13

14.3. Dzierawy i sponsorowanie ................................................................................. 622


Dzierawa ......................................................................................................... 623
Sponsorowanie ................................................................................................. 626
14.4. Podsumowanie .................................................................................................. 628
14.5. Sprawd, czego si nauczye ............................................................................. 628

Rozdzia 15. Usprawnianie kodu, bezpieczestwo i instalacja .............................................................631


15.1. Stosowanie standardw programowania platformy .NET ....................................... 633
Uywanie FxCop ................................................................................................ 633
15.2. Zestawy z siln nazw ....................................................................................... 636
Tworzenie zestaww z siln nazw ...................................................................... 637
Podpisywanie opnione .................................................................................... 638
Globalna pami podrczna zestaww (GAC) ....................................................... 639
Kontrola wersji .................................................................................................. 640
15.3. Bezpieczestwo ................................................................................................ 641
Uprawnienia i zbiory uprawnie ........................................................................... 642
Dowd .............................................................................................................. 646
Zasady bezpieczestwa ..................................................................................... 648
Konfigurowanie zasad bezpieczestwa ................................................................ 650
Narzdzie konfiguracyjne platformy .NET ............................................................. 651
Konfiguracja bezpieczestwa opartego na uprawnieniach kodu za pomoc narzdzia
konfiguracyjnego przykad praktyczny ............................................................ 653
danie uprawnie dla zestawu .......................................................................... 657
Zabezpieczanie programowe ............................................................................... 660
15.4. Instalowanie aplikacji ........................................................................................ 667
Instalacja w systemie Windows XCOPY a instalator Windows ............................ 667
Instalowanie zestaww w globalnej pamici podrcznej zestaww ......................... 668
Instalowanie zestaww prywatnych ..................................................................... 668
Konfigurowanie za pomoc elementu codeBase ................................................... 669
Uywanie pliku konfiguracyjnego do zarzdzania rnymi wersjami zestaww .......... 670
Wersje zestawu i informacje o produkcie ............................................................. 670
15.5. Podsumowanie .................................................................................................. 671
15.6. Sprawd, czego si nauczye ............................................................................. 672

Cz IV Programowanie aplikacji internetowych

675

Rozdzia 16. Formularze i kontrolki ASP.NET .........................................................................................677


16.1. Komunikacja klient-serwer poprzez poczenie internetowe ................................... 678
Przykadowa aplikacja internetowa ...................................................................... 680
Kalkulator BMI w jzyku ASP.NET ........................................................................ 684
Model wykorzystujcy kod inline ......................................................................... 685
Model wykorzystujcy kod ukryty ......................................................................... 691
Kod ukryty i klasy czciowe .............................................................................. 695
Klasa Page ....................................................................................................... 696
16.2. Kontrolki formularzy Web ................................................................................... 699
Przegld kontrolek Web ..................................................................................... 700
Okrelanie wygldu kontrolek Web ...................................................................... 701
Proste kontrolki ................................................................................................. 701
Kontrolki do obsugi list ..................................................................................... 706
Kontrolka DataList ............................................................................................ 708

14

C# i .NET
16.3. Wizanie danych oraz kontrolki do obsugi rde danych ...................................... 711
Wizanie z obiektem DataReader ....................................................................... 711
Wizanie z obiektem DataSet ............................................................................. 712
Kontrolki do obsugi rde danych ...................................................................... 714
16.4. Kontrolki walidacyjne ......................................................................................... 721
Uywanie kontrolek walidacyjnych ....................................................................... 721
16.5. Strony gwne i strony z treci .......................................................................... 725
Tworzenie strony gwnej ................................................................................... 726
Tworzenie stron z treci ................................................................................... 727
Dostp do strony gwnej ze stron z treci ......................................................... 728
16.6. Tworzenie i uywanie niestandardowych kontrolek Web ........................................ 729
Przykadowa niestandardowa kontrolka ............................................................... 729
Uywanie niestandardowych kontrolek ................................................................. 732
Zarzdzanie stanem kontrolki ............................................................................. 732
Kontrolki zoone ............................................................................................... 733
16.7. Wybr kontrolki Web do wywietlania danych ....................................................... 736
16.8. Podsumowanie .................................................................................................. 737
16.9. Sprawd, czego si nauczye ............................................................................. 737

Rozdzia 17. rodowisko aplikacji ASP.NET ...........................................................................................739


17.1. Klasy HttpRequest i HttpResponse ..................................................................... 740
Obiekt HttpRequest ........................................................................................... 741
Obiekt HttpResponse ........................................................................................ 744
17.2. ASP.NET i pliki konfiguracyjne ............................................................................ 748
Zawarto pliku web.config ................................................................................ 749
Dodawanie niestandardowych elementw konfiguracyjnych ................................... 753
17.3. Bezpieczestwo aplikacji ASP.NET ...................................................................... 756
Uwierzytelnianie przy uyciu formularzy ................................................................ 757
Przykad zastosowania uwierzytelniania przy uyciu formularzy ............................... 759
17.4. Przechowywanie stanu ....................................................................................... 763
Stan aplikacji .................................................................................................... 765
Stan sesji ......................................................................................................... 766
17.5. Pami podrczna ............................................................................................. 769
Umieszczanie w pamici podrcznej odpowiedzi ................................................... 769
Umieszczanie danych w pamici podrcznej ........................................................ 772
17.6. Tworzenie klienta uywajcego klas WebRequest i WebResponse ......................... 775
Klasy WebRequest i WebResponse ..................................................................... 775
Przykadowy klient internetowy ............................................................................ 775
17.7. Potoki HTTP ...................................................................................................... 777
Przetwarzania dania w potoku ......................................................................... 778
Klasa HttpApplication ........................................................................................ 779
Moduy HTTP ..................................................................................................... 782
Obiekty obsugi HTTP ......................................................................................... 787
17.8. Podsumowanie .................................................................................................. 790
17.9. Sprawd, czego si nauczye ............................................................................. 791

Rozdzia 18. Usugi Web ..........................................................................................................................793


18.1. Wprowadzenie do usug Web .............................................................................. 794
Wyszukiwanie i uywanie usug Web .................................................................... 796
18.2. Tworzenie usugi Web ........................................................................................ 798
Samodzielne tworzenie usugi Web ..................................................................... 799
Tworzenie usugi Web za pomoc rodowiska VS.NET .......................................... 802
Rozszerzanie usug Web za pomoc atrybutw WebService i WebMethod ............... 803

Spis treci

15

18.3. Tworzenie klienta usugi Web ............................................................................. 806


Tworzenie prostego klienta uywajcego klasy usugi Web .................................... 807
Tworzenie porednika za pomoc rodowiska Visual Studio .NET .......................... 814
18.4. Jzyk WSDL i protok SOAP ............................................................................... 815
Jzyk opisu usug Web (WSDL) ........................................................................... 815
Prosty protok dostpu do obiektw (SOAP) ....................................................... 818
18.5. Uywanie zoonych typw danych w usugach Web .............................................. 825
Usuga Web zwracajca rysunki .......................................................................... 825
Uywanie usug Web Amazonu ............................................................................ 827
Tworzenie porednika dla usug Web Amazonu .................................................... 829
Tworzenie klienta usugi Web za pomoc formularzy Windows ............................... 830
18.6. Wydajno usug Web ........................................................................................ 832
Konfigurowanie poczenia HTTP ........................................................................ 833
Obsuga duych iloci danych ............................................................................. 834
18.7. Podsumowanie .................................................................................................. 835
18.8. Sprawd, czego si nauczye ............................................................................. 835

Dodatki

837

Dodatek A Elementy wprowadzone w .NET 2.0 i C# 2.0 .......................................................................839


Dodatek B Zdarzenia i delegacje kontrolki DataGridView ...................................................................843
Odpowiedzi do pyta ...............................................................................................................................853
Skorowidz ...............................................................................................................................................869

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

27

Zagadnienia omawiane w tym rozdziale:


n

Przegld skadnikw platformy .NET architektura i najwaniejsze cechy


technologii .NET.

Wsplne rodowisko uruchomieniowe (CLR) przegld zada wykonywanych


przez cz uruchomieniow (wykonawcz) platformy .NET Framework, czyli
funkcjonowania kompilatora na bieco (JIT), mechanizmw wczytywania
zestaww oraz technik weryfikacji kodu.

Wsplny system typw (CTS) i specyfikacja wsplnego jzyka (CLS) mechanizmy


wsplnego rodowiska uruchomieniowego (CLR) w zakresie zapewniania zgodnoci
i moliwoci wsppracy jzykw programowania.

Zestawy .NET analiza struktury zestaww, filozofii tych zestaww oraz rnic
pomidzy zestawami prywatnymi a zestawami wspdzielonymi.

Biblioteka klas platformy (FCL) biblioteka platformy .NET oferuje setki klas
bazowych pogrupowane w ramach logicznych przestrzeni nazw.

Narzdzia programowania wraz z platform .NET otrzymujemy wiele narzdzi


uatwiajcych wytwarzanie kodu rdowego. Mamy do dyspozycji midzy innymi
narzdzie Ildasm do odwracania kompilacji kodu, WinCV do przegldania waciwoci
klasy oraz narzdzie konfiguracyjne Framework Configuration.

Kompilowanie i uruchamianie programw napisanych w jzyku C# korzystanie


z kompilatora jzyka programowania C# z poziomu wiersza polece wraz
z omwieniem opcji decydujcych o strukturze kompilowanej aplikacji.

Efektywne uywanie jzyka programowania wymaga czego wicej ni dobrej znajomoci


jego skadni i oferowanych mechanizmw. W praktyce podczas poznawania najnowszych
technologii coraz wiksz rol odgrywa dogbne studiowanie samych rodowisk programowania. Nie wystarczy wic opanowanie do perfekcji samego jzyka C# wydajny

28

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


i skuteczny programista czy architekt oprogramowania musi te nabra biegoci w korzystaniu z odpowiednich bibliotek klas i narzdzi umoliwiajcej zagbianie si w te biblioteki, diagnozowanie kodu oraz sprawdzanie faktycznej efektywnoci stosowanych konstrukcji
programistycznych.
Celem tego rozdziau jest uwiadomienie Czytelnikom istnienia najwaniejszych rozwiza
oferowanych w ramach rodowiska .NET, zanim jeszcze przystpi do nauki skadni i semantyki jzyka programowania C#. Skupimy si przede wszystkim na tym, jak to rodowisko (nie jzyk) wpywa na sposb wytwarzania oprogramowania. Jeli nie masz dowiadczenia w korzystaniu z technologii .NET, powiniene uwanie przestudiowa kilka nowych
koncepcji, ktre tam wprowadzono. .NET zmienia sposb mylenia o dziedziczonym (czsto
przestarzaym) kodzie oraz kontroli wersji, zmienia sposb dysponowania zasobami programowymi, umoliwia korzystanie z kodu napisanego w jednym z poziomu innego jzyka,
upraszcza wdraanie kodu, poniewa eliminuje niepotrzebne zwizki z rejestrem systemowym, oraz tworzy samo-opisujcy metajzyk, ktry moe by wykorzystywany do okrelania
logiki programu w czasie jego wykonywania. Z kadym z tych elementw bdziesz mia do
czynienia na rnych etapach procesu wytwarzania oprogramowania i kady z nich bdzie
mia wpyw na sposb projektowania i wdraania Twoich aplikacji.
Z punktu widzenia programisty platforma .NET skada si ze rodowiska uruchomieniowego
(wykonawczego) poczonego z bibliotek klas bazowych. Organizacja tego rozdziau odpowiada wanie takiemu postrzeganiu platformy .NET. Rozdzia zawiera dwa osobne podrozdziay powicone odpowiednio wsplnemu rodowisku uruchomieniowemu (ang. Common
Language Runtime CLR) oraz bibliotece klas platformy (ang. Framework Class Library
FCL). W dalszej czci tego rozdziau zostan przedstawione podstawowe narzdzia,
dziki ktrym programista moe nie tylko w sposb wrcz intuicyjny realizowa pewne zadania w procesie wytwarzaniem oprogramowania dla platformy .NET, ale te zarzdza i dystrybuowa aplikacje. W ostatnim podrozdziale, swoistym preludium rozdziau 2., Czytelnik
zostanie wprowadzony w wiat kompilatora C# wraz z kilkoma przykadami praktycznych
zastosowa.

Platform .NET zaprojektowano jako zintegrowane rodowisko, ktre w zaoeniu ma umoliwia bezproblemowe wytwarzanie i uruchamianie aplikacji internetowych, aplikacji bazujcych na Windows Forms, a nawet aplikacji dla urzdze mobilnych (z wykorzystaniem
platformy Compact Framework). Na poniszej licie wymieniono podstawowe cele, jakie postawili sobie twrcy tej platformy:
n

Zapewnienie logicznie spjnego, obiektowego rodowiska dla rozmaitych aplikacji.

Zapewnienie rodowiska, ktre pozwoli zminimalizowa konflikty wersji (popularnie


nazywane piekem DLL), ktre przez wiele lat przeladoway programistw
Windows (COM) i tym samym uproci proces dystrybucji (instalacji) kodu.

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#


n

Zapewnienie przenonego rodowiska, ktre bdzie bazowao na certyfikowanych


standardach i ktre bdzie dawao moliwo zarzdzania przez dowolny system
operacyjny. Ju teraz jzyk programowania C# i podstawowy skadnik rodowiska
uruchomieniowego technologii .NET, infrastruktura wsplnego jzyka (ang. Common
Language Infrastructure CLI), s objte odpowiednimi standardami ECMA1.

Zapewnienie rodowiska zarzdzanego, w ktrym weryfikacja kodu pod ktem


bezpieczestwa wykonywania bdzie moliwie prosta.

29

Aby zrealizowa te ambitne cele, projektanci platformy .NET Framework opracowali do


specyficzn architektur, ktra dzieli t platform na dwie czci: wsplne rodowisko uruchomieniowe (CLR) oraz bibliotek klas platformy (FCL). Na rysunku 1.1 przedstawiono graficzn reprezentacj zastosowanego podejcia.
Rysunek 1.1.
Platforma .NET

rodowisko uruchomieniowe CLR, czyli opracowana przez firm Microsoft implementacja


standardu CLI, obsuguje wykonywanie kodu i wszystkie zwizane z tym zadania, czyli kompilacj, zarzdzanie pamici, zapewnianie bezpieczestwa, zarzdzanie wtkami oraz wymuszanie bezpieczestwa typw. O kodzie wykonywanym we wsplnym rodowisku uruchomieniowym (CLR) mwimy, e jest kodem zarzdzanym. Stosowanie tej terminologii pozwala
odrni taki kod od kodu niezarzdzanego, ktry nie implementuje wymaga zwizanych
z funkcjonowaniem w rodowisku CLR, czyli np. od obiektw COM czy komponentw bazujcych na interfejsie programowym Windows API.
Inny wany skadnik technologii .NET, biblioteka klas platformy (FCL), jest jak sama
nazwa wskazuje bibliotek kodu wielokrotnego uytku definiujc typy (klasy, struktury
itp.), ktre s udostpniane aplikacjom wykonywanym w rodowisku uruchomieniowym
platformy .NET. Zgodnie z tym, co przedstawiono na rysunku 1.1, biblioteka FCL obejmuje
klasy obsugujce dostp do bazy danych, operacje graficzne, interakcj z kodem niezarzdzanym, bezpieczestwo oraz obsug interfejsw uytkownika w postaci stron WWW i formularzy Windows Forms. Okazuje si, e z tej jednej biblioteki klas korzystaj wszystkie jzyki przygotowane do wsppracy z platform .NET Framework. Oznacza to, e po zdobyciu
dowiadczenia w pracy ze wspomnianymi typami bdziemy mogli stosowa nasz wiedz,
piszc kod w dowolnych jzykach programowania technologii .NET.
1

W niniejszej ksice we wszystkich odwoaniach do organizacji ECMA International (nazywanej dawniej


European Computer Manufacturers Association) dla uproszczenia bdziemy si posugiwali samym
skrtem ECMA.

30

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET

Microsoft .NET i standardy CLI


Naturalne pytanie stawiane przez programistw, ktrzy decyduj si zainwestowa swj czas
w nauk jzyka programowania C# i mechanizmw platformy .NET, dotyczy tego, czy bd
mogli wykorzystywa pozyskan wiedz take na innych platformach. W szczeglnoci programici chc wiedzie, czy technologia .NET, jako produkt Microsoftu, jest cile zwizana
z systemem operacyjnym Windows czy moe jest przenon platform wytwarzania i wdraania oprogramowania, ktr bdzie mona implementowa dla konkurencyjnych systemw
operacyjnych. Odpowied na to pytanie wymaga dobrego rozumienia relacji czcych technologi Microsoft .NET, jzyk programowania C# oraz standardy infrastruktury wsplnego
jzyka (CLI).
Standard infrastruktury wsplnego jzyka (CLI) definiuje niezalene od platformy rodowisko wykonywania wirtualnego kodu. CLI nie preferuje adnego systemu operacyjnego, zatem
mona go z powodzeniem stosowa zarwno w systemie Linux, jak i w Windows. Centralnym elementem tego standardu jest definicja wsplnego jzyka poredniego (ang. Common
Intermediate Language CIL), ktry musi by generowany przez kompilatory zgodne ze
standardem CLI, oraz system typw, ktry definiuje typy danych obsugiwane przez wszystkie zgodne jzyki programowania. Jzyk poredni jest kompilowany do jzyka waciwego
dla docelowego systemu operacyjnego (patrz nastpny podrozdzia).
Infrastruktura wsplnego jzyka (CLI) obejmuje take standardy dla samego jzyka C#, ktry
zosta stworzony i wypromowany przez firm Microsoft, i jako taki jest de facto standardowym jzykiem programowania dla platformy .NET. Warto jednak pamita, e pozostali
producenci szybko zainteresowali si standardem CLI i opracowali wasne kompilatory dla
takich jzykw jak Python, Pascal, Fortran, Cobol czy Eiffel .NET (przedstawiona lista oczywicie nie jest kompletna).
Platforma .NET (patrz rysunek 1.1) jest w istocie implementacj standardw CLI zaproponowan przez firm Microsoft. Najwaniejsz cech tej implementacji jest to, e oferuje
daleko bardziej rozbudowany zestaw rozwiza i funkcji ni ten zdefiniowany w standardowej infrastrukturze wsplnego jzyka. Aby si o tym przekona, wystarczy porwna przedstawion wczeniej struktur platformy .NET z architektur standardw CLI zaprezentowan
na rysunku 1.2.
Rysunek 1.2.
Architektura
zdefiniowana
przez specyfikacje
infrastruktury
wsplnego
jzyka (CLI)

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

31

Najkrcej mwic, infrastruktura wsplnego jzyka (CLI) definiuje dwie implementacje:


implementacj minimaln, nazywan profilem jdra (ang. Kernel Profile), oraz implementacj
bogatsz, nazywan profilem kompaktowym (ang. Compact Profile). Profil jdra zawiera
typy i klasy niezbdne do pracy kompilatorw zgodnych ze standardem CLI. Biblioteka
klas bazowych (ang. Base Class Library) zawiera nie tylko podstawowe klasy typw danych,
ale take klasy obsugujce proste operacje dostpu do plikw, definiujce atrybuty zabezpiecze oraz implementujce jednowymiarowe tablice. Profil kompaktowy wprowadza trzy dodatkowe biblioteki klas: bibliotek XML definiujc proste mechanizmy analizy skadniowej
jzyka XML, bibliotek Network obsugujc protok HTTP i dostp do portw oraz bibliotek Reflection obsugujc refleksje (mechanizm analizy programu przez samego siebie
za porednictwem metadanych).
Niniejsza publikacja byaby duo krtsza, gdyby zamiast implementacji zaproponowanej przez
firm Microsoft opisywaa wycznie zalecenia standardu CLI. Moglibymy cakowicie zrezygnowa z rozdziaw powiconych bibliotece ADO.NET (zawierajcej klasy obsugujce dostp do baz danych), bibliotece ASP.NET (zawierajcej klasy aplikacji internetowych)
oraz bibliotece Windows Forms co wicej, rozdziay powicone jzykowi XML byyby
nieporwnanie krtsze. Jak si zapewne domylasz, wymienione biblioteki s w jakim stopniu uzalenione od funkcjonalnoci wykorzystywanego interfejsu Windows API. Twrcy technologii .NET dodatkowo przewidzieli moliwo wywoywania przez program interfejsu
Win32 API za porednictwem mechanizmu nazwanego Interop. Oznacza to, e programista
.NET ma dostp nie tylko do interfejsu Win32 API, ale take do ju dziaajcych aplikacji
i komponentw (COM).
Ten do szeroki most czcy technologi .NET z systemem Windows sprawia, e implementacja firmy Microsoft jest bardziej przezroczysta od rodowisk wirtualnych nie twierdz przy tym, e takie rozwizanie jest nieuzasadnione. Dziki temu programici, ktrzy
stawiaj pierwsze kroki, tworzc oprogramowania dla platformy .NET, mog przynajmniej
na pocztku pisa aplikacje hybrydowe, czyli takie, ktre bd w sobie czyy komponenty .NET z istniejcym kodem. Warto jednak pamita, e budowa takich hybryd wyklucza
moliwo przenoszenia kodu gotowego do innych systemw operacyjnych.
Mam te dobr wiadomo dla programistw, a wic take Czytelnikw niniejszej ksiki
zaproponowane przez firm Microsoft dodatkowe mechanizmy wzbudziy zainteresowanie szerszej spoecznoci, ktra zaangaowaa si w opracowywanie implementacji CLI
oferowanych z otwartym dostpem do kodu rdowego. Zespoowi realizujcemu jeden
z czoowych projektw tego typu, nazwanego Mono2, ju teraz udao si zaimplementowa wikszo mechanizmw bibliotek ADO.NET i Windows Forms, wszystkie klasy obsugujce jzyk XML oraz bogaty zbir klas obsugujcych kolekcje. Jest to o tyle wane,
e wiedz i dowiadczenie zdobyte podczas pracy z technologi Microsoft .NET bdzie mona wykorzysta do implementowania podobnych rozwiza dla takich platform jak Linux,
BSD czy Solaris. Majc to na uwadze, sprbujmy teraz przeanalizowa najwaniejsze cechy
implementacji standardu CLI zaproponowanej przez firm Microsoft.

Patrz strona internetowa http://www.mono-project.com/Main_Page.

32

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET

Wsplne rodowisko uruchomieniowe (CLR) zarzdza caym cyklem ycia aplikacji: lokalizuje i kompiluje kod, wczytuje powizane klasy, zarzdza wykonywaniem aplikacji, a take
zapewnia automatyczne zarzdzanie pamici. Co wicej, rodowisko CLR obsuguje ca
integracj jzykw programowania, czyli de facto odpowiada za bezproblemow wspprac kodu zapisanego w rnych jzykach i skompilowanego za pomoc rnych kompilatorw. W niniejszym podrozdziale przyjrzymy si funkcjonowaniu wewntrznych mechanizmw wsplnego rodowiska uruchomieniowego, aby si przekona, jak opisane przed chwil
cele faktycznie s realizowane. Nie bdzie to co prawda analiza szczegowa, ale z pewnoci
wystarczy do zapoznania si z terminologi, zaznajomienia z architektur niezalen od jzykw programowania i zrozumienia, co rzeczywicie si dzieje w momencie, w ktrym tworzymy i uruchamiamy nasze programy.
Rysunek 1.3.
Funkcje wsplnego
rodowiska
uruchomieniowego
(CLR)

Kompilacja kodu platformy .NET


Kompilatory speniajce wymagania wsplnego rodowiska uruchomieniowego (CLR) generuj kod wanie dla docelowego rodowiska uruchomieniowego (wykonawczego), a nie
dla konkretnego procesora. Generowany w ten sposb kod, nazywany wsplnym jzykiem porednim (CIL), jzykiem porednim (IL) lub jzykiem porednim Microsoft (MSIL),
w praktyce ma posta kodu maszynowego umieszczanego w plikach EXE lub DLL. Warto
pamita, e nie s to standardowe pliki wykonywalne, poniewa dodatkowo wymagaj uycia kompilatora na bieco (ang. Just-in-Time, w skrcie JIT), ktry w czasie wykonywania aplikacji dokona konwersji jzyka poredniego na odpowiedni kod maszynowy. Poniewa
za zarzdzanie tym jzykiem porednim odpowiada wsplne rodowisko uruchomieniowe,
kod zapisany w tym jzyku jest nazywany kodem zarzdzanym (ang. managed code).
Kod poredni jest kluczem do spenienia formalnego celu stawianego platformie .NET, czyli
zgodnoci rnych jzykw programowania. Zgodnie z tym, co przedstawiono na rysunku 1.3,
wsplne rodowisko uruchomieniowe (CLR) nie wie bo nie musi wiedzie w ktrym

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

33

jzyku napisano dan aplikacj. rodowisko CLR otrzymuje kod jzyka poredniego (IL),
ktry jest niezaleny od stosowanych jzykw programowania. Poniewa aplikacje komunikuj si midzy sob wanie za porednictwem swojego kodu jzyka poredniego, efekty
pracy jednego kompilatora mog by integrowane z kodem wygenerowanym przez inny
kompilator.
Realizacja innego wanego celu technologii .NET, przenonoci, jest moliwa dziki przeniesieniu procesu tworzenia kodu maszynowego na poziom kompilatora JIT. Oznacza to, e
wygenerowany na jednej platformie kod jzyka poredniego moe by wykonywany na innej
platformie zawierajcej wasn platform i kompilator JIT, ktry generuje kod maszynowy
waciwy dla tej platformy.
Poza generowaniem kodu jzyka poredniego kompilatory speniajce wymagania wsplnego rodowiska uruchomieniowego (CLR) dodatkowo musz generowa odpowiednie metadane w kadym module kodu. Metadane maj posta zbioru tabel, ktry zapewnia tym
moduom kodu niezwykle wan wasno samoopisywania. Takie tabele zawieraj informacje o zestawie, pakiecie kodu (ang. assembly), do ktrego naley dany kod, oraz kompletny
opis samego kodu. Reprezentowane w ten sposb informacje obejmuj midzy innymi dostpne typy, nazwy poszczeglnych typw, skadowe typw, atrybuty zasigu (widocznoci) typw
oraz wszelkie inne cechy typw. Metadane maj wiele zastosowa:
n

Najwaniejszym uytkownikiem metadanych jest kompilator JIT, ktry wydobywa


z nich wszystkie informacje o typach niezbdne do przeprowadzenia procesu
kompilacji. Kompilator wykorzystuje te informacje take do weryfikacji kodu,
aby mie pewno, e dany program wykonuje swoje operacje prawidowo.
Przykadowo, kompilator JIT sprawdza prawidowo wywoa metod, porwnujc
wykorzystywane parametry wywoa z tymi, ktre zdefiniowano w metadanych
odpowiednich metod.

Metadane s wykorzystywane przez proces odpowiedzialny za odzyskiwanie


(czyszczenie) pamici (ang. Garbage Collection), czyli podstawowy skadnik
platformy .NET w dziedzinie zarzdzania pamici. Proces GC (ang. Garbage
Collector) uywa metadanych do okrelania, kiedy pola w ramach danego obiektu
odwouj si od innych pl i tym samym kiedy mona, a kiedy nie mona
odzyska pamici zajmowanej przez te obiekty.

Platforma .NET zawiera zbir klas obsugujcych funkcjonalno w zakresie


odczytywania metadanych z wntrza programu. Tego rodzaju funkcjonalno
nazywa si zbiorczo refleksj (ang. reflection). Si tego rozwizania jest
moliwo wykonywania przez program zapyta odnonie zawartoci metadanych
i podejmowania waciwych decyzji w zalenoci od uzyskiwanych odpowiedzi.
Podczas lektury dalszej czci tej ksiki przekonasz si, e wanie refleksja jest
kluczem do efektywnej pracy z niestandardowymi atrybutami, czyli obsugiwanymi
w jzyku C# konstrukcjami w zakresie dodawania do programw niestandardowych
metadanych (metadanych uytkownika).

Wanie jzyk poredni (IL) i metadane decyduj o moliwoci wzajemnej wsppracy wielu
jzykw programowania, jednak faktyczny sukces tego rozwizania zaley od tego, czy
wszystkie kompilatory .NET rzeczywicie bd obsugiway wsplny zbir typw danych
i specyfikacje jzykw. Przykadowo, dwa rne jzyki nie mog by ze sob w peni zgodne

34

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


na poziomie kodu IL, jeli jeden obsuguje 32-bitowe liczby cakowite ze znakiem, a drugi
nie. Jzyki platformy .NET mog si od siebie rni skadniowo (np. typ int w jzyku C#
odpowiada typowi Integer w jzyku Visual Basic), ale musi midzy nimi istnie zgodno
bazowych typw reprezentowanych przez te czsto odmienne konstrukcje.
Jak ju wspomniano, standard infrastruktury wsplnego jzyka (CLI) definiuje formaln specyfikacj typw, nazwan wsplnym systemem typw (ang. Common Type System CTS),
ktra jest integraln czci wsplnego rodowiska uruchomieniowego (CLR). System CTS
definiuje nie tylko same typy, ale take zachowania gwarantujce pen zgodno ze rodowiskiem CLR.

Wsplny system typw (CTS)


Wsplny system typw (CTS) zawiera bazowy zbir typw danych dla kadego jzyka zgodnego ze specyfikacj platformy .NET. CTS dodatkowo definiuje sposb deklarowania i tworzenia typw niestandardowych oraz mechanizm zarzdzania cyklem ycia instancji tych
typw. Organizacj wsplnego systemu typw (CTS) przedstawiono na rysunku 1.4.
Rysunek 1.4.
Typy bazowe
zdefiniowane
przez wsplny
system
typw (CTS)

Na postawie powyszego rysunku mona wywnioskowa dwie rzeczy. Najbardziej oczywisty


jest podzia (kategoryzacja) typw na typy referencyjne (ang. reference types) i typy wartociowe (ang. value types). Ten podstawowy podzia ma zwizek ze sposobem skadowania typw i uzyskiwania dostpu do pamici, w ktrej s przechowywane w dostpie do
typw referencyjnych wykorzystuje si specjalny obszar pamici, nazywany stert (ang. heap),
i porednictwo wskanikw; natomiast do typw wartociowych mona si odwoywa bezporednio, poniewa s skadowane na stosie programu. Drugim wanym wnioskiem pyncym z analizy rysunku 1.4 jest to, e wszystkie typy zarwno typy niestandardowe, jak
i typy definiowane przez platform .NET musz dziedziczy po jednym, predefiniowanym typie System.Object. Takie rozwizanie daje nam pewno, e wszystkie typy obsuguj
podstawowy zbir dziedziczonych po tym typie bazowym metod i waciwoci.
W technologii .NET pojcie typu jest bardzo oglne moe si odnosi do klasy,
struktury, typu wyliczeniowego, delegacji lub interfejsu.

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

35

Kompilator zgodny ze specyfikacj wsplnego systemu typw (CTS) musi gwarantowa, e


jego typy bd prawidowo obsugiwane przez wsplne rodowisko uruchomieniowe (CLR).
Sama zgodno typu nie oznacza jeszcze, e dany jzyk bdzie si mg komunikowa z pozostaymi jzykami. Taka moliwo bdzie wymagaa zgodnoci z bardziej restrykcyjnym
zbiorem specyfikacji wsplnego jzyka (ang. Common Language Specification CLS),
ktre definiuj podstawowe reguy wsppracy jzykw programowania. Wspomniane specyfikacje s w istocie minimalnym zestawem wymaga, ktre musz by spenione przez
kady kompilator zapewniajcy pen zgodno ze rodowiskiem CLR.
W tabeli 1.1 przedstawiono wybrany zbir regu specyfikacji wsplnego jzyka (CLS), ktre
dobrze ilustruj, jakiego rodzaju wasnoci naley uwzgldnia podczas tworzenia typw
zgodnych z t specyfikacj (kompletn list mona znale w dokumentacji zestawu narzdzi .NET SDK).
Tabela 1.1. Wybrane wasnoci i reguy specyfikacji wsplnego jzyka (CLS)
Wasnoci

Regua

Widoczno (zasig)

Reguy widocznoci maj zastosowanie tylko dla tych skadowych typu,


ktre s udostpniane poza definiujcym je zestawem .NET.

Znaki i wielko liter

Aby dwie zmienne byy traktowane jak osobne struktury, ich nazwy musz si
rni czym wicej ni tylko wielkoci liter.

Typy podstawowe

Wymienione podstawowe typy danych s zgodne ze specyfikacj wsplnego


jzyka (CLS): Byte, Int16, Int32, Int64, Single, Double, Boolean, Char, Decimal,
IntPtr oraz String.

Wywoania konstruktorw Konstruktor musi wywoa konstruktor klasy bazowej, zanim bdzie mg
uzyska dostp do ktregokolwiek z jej pl.
Granice tablic
Typy wyliczeniowe

Dolna granica (najniszy indeks) wszystkich wymiarw tablic jest zero (0).
Typem bazowym wykorzystywanym w typach wyliczeniowych musi by Byte,
Int16, Int32 lub Int64.

Sygnatury metod

Typy wszystkich parametrw i zwracanych wartoci wykorzystywanych


w sygnaturach metod musz by zgodne ze specyfikacj wsplnego jzyka (CLS).

Przedstawione reguy s stosunkowo proste, ale te do konkretne. Przyjrzyjmy si teraz


fragmentowi kodu jzyka C#, aby lepiej zrozumie, jak opisane metody s stosowane
w praktyce.
public class Conversion
{
public double Metric( double inches)
{ return (2.54 * inches); }
public double metric( double miles)
{ return (miles / 0.62); }
}

Nawet jeli nie masz dowiadczenia w pracy z kodem jzyka C#, powiniene bez trudu
wskaza miejsce, w ktrym przedstawiony kod narusza reguy specyfikacji CLS. Zgodnie
z drug regu opisan w tabeli 1.1 nazwy konstrukcji jzykowych s uwaane za rne, jeli rni si czym wicej ni tylko wielkoci znakw. atwo zauway, e nazwy metod

36

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


Metric() i metric()ami t regu. Przedstawiony fragment kodu zostanie co prawda prawi-

dowo zinterpretowany przez kompilator jzyka C#, jednak ju program napisany w jzyku
Visual Basic.NET ktry ignoruje wielko liter nie mgby odrni nazw obu metod.

Zestawy .NET
Cay zarzdzany kod wykonywany na platformie .NET musi si znajdowa w specjalnych
zestawach (nazywanych te pakietami kodu lub moduami .NET). Kady taki zestaw logicznie jest przetwarzany jako pojedynczy plik EXE lub DLL. Fizycznie zestaw .NET moe
si jednak skada z caej kolekcji plikw zawierajcych sam kod oraz niezbdne zasoby
(np. obrazy lub dane w formacie XML).
Zestaw jest tworzony w chwili, gdy kompilator zgodny ze specyfikacj .NET konwertuje
plik zawierajcy kod rdowy na odpowiedni plik DLL lub EXE. Jak wida na rysunku 1.5,
zestaw skada si z manifestu, metadanych oraz wygenerowanego przez kompilator jzyka poredniego (IL). Poniej przyjrzymy si poszczeglnym skadnikom zestaww nieco
dokadniej.
Rysunek 1.5.
Zestaw .NET
skadajcy si
z jednego pliku

Manifest. Kady zestaw .NET musi zawiera pojedynczy plik zawierajcy


tzw. manifest. Manifest jest zbiorem tabel metadanych, ktre zawieraj listy nazw
wszystkich plikw w danym zestawie, referencje do zestaww zewntrznych oraz
informacje umoliwiajce identyfikacj danego zestawu (czyli np. nazw i numer
wersji). Zestawy z silnymi nazwami (ang. strongly named assemblies patrz
dalsza cz tego rozdziau) dodatkowo zawieraj unikatowe sygnatury cyfrowe.
Podczas wczytywania zestawu .NET rodowisko CLR w pierwszej kolejnoci otwiera
wanie plik zawierajcy manifest, aby mie moliwo identyfikacji pozostaych
skadnikw danego zestawu.
Metadane. Poza opisanymi przed chwil tabelami manifestu kompilator C# generuje
jeszcze tabele definicji i referencji. Tabele definicji zawieraj kompletny opis typw
stosowanych w kodzie jzyka poredniego. Przykadowo, kompilator C# generuje
tabele definiujce typy, metody, pola, parametry i waciwoci. Tabele referencji
zawieraj informacje o wszystkich referencjach do typw i pozostaych zestaww.
Kompilator JIT wykorzystuje te tabele podczas konwertowania kodu jzyka
poredniego na rdzenny kod maszynowy.

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

37

Jzyk poredni. Rol kodu jzyka poredniego (IL) omwilimy we wczeniejszej


czci tego rozdziau. Zanim wsplne rodowisko uruchomieniowe (CLR) bdzie
mogo uy kodu tego jzyka, musimy ten kod umieci w zestawach (plikach EXE
lub DLL). Warto pamita, e wymienione rodzaje plikw nie s identyczne zestaw
.NET w postaci pliku EXE musi definiowa punkt wejcia (ang. entry point),
od ktrego rozpocznie si jego wykonywanie, natomiast plik DLL peni funkcj
biblioteki kodu zawierajcej definicje typw.
Zestaw jest czym wicej ni tylko logicznym sposobem upakowywania kodu wykonywalnego. Zestawy s sercem zastosowanego w technologii .NET modelu rozmieszczania (wdraania) kodu, kontroli wersji i zapewniania bezpieczestwa:
n

Cay zarzdzany kod, niezalenie od tego, czy ma posta autonomicznego programu,


kontrolki czy biblioteki DLL zawierajcej typy wielokrotnego uytku, jest umieszczany
wanie w zestawach. Zestaw .NET jest jednostk najbardziej atomow, ktr mona
wdroy w systemie. Do uruchomienia aplikacji wymagane s tylko te zestawy,
bez ktrych nie mona przeprowadzi fazy inicjalizacji. Pozostae zestawy s
wczytywane na danie (wedug potrzeb). Dowiadczeni programici potrafi
efektywnie wykorzystywa taki podzia aplikacji dziel kod pomidzy zestawy
.NET w zalenoci od czstotliwoci jego wykorzystywania.

W argonie programistw technologii .NET zestaw wyznacza tzw. granic wersji


(ang. version boundary). Pole wersji w manifecie jest stosowane dla wszystkich
typw i zasobw w danym zestawie. Oznacza to, e wszystkie pliki skadajce si
na ten zestaw s traktowane jak ta sama jednostka, oznaczona t sam wersj.
Dziki takiemu oddzieleniu warstwy fizycznych zestaww od logicznego podziau
w technologii .NET istnieje moliwo wspuytkowania logicznych atrybutw
przez wiele plikw fizycznych. Ta wyjtkowa cecha odrnia pliki zestaww
od tradycyjnych, systemowych plikw DLL.

Zestaw wyznacza te granic bezpieczestwa (ang. security boundary), od ktrej


zale wszelkie uprawnienia dostpu. W jzyku C# stosuje si tzw. modyfikatory
dostpu (ang. access modifiers), ktre kontroluj dostp do typw i skadowych
typw w ramach zestaww. Dwa takie modyfikatory s stosowane do wyznaczania
granic bezpieczestwa w dostpie do zestaww: modyfikator public zezwala
na nieograniczony dostp do zestawu .NET, natomiast modyfikator internal
ogranicza ten dostp do typw i skadowych nalecych do tego samego zestawu.

Jak ju wspomniano, zestaw moe si skada z wielu plikw. Nie musz to by wycznie
moduy kodu w skad zestawu mog wchodzi take pliki zasobw, w tym obrazy graficzne i pliki tekstowe. W typowych zastosowaniach tego rodzaju pliki maj na celu umoliwienie aplikacji wykorzystywanie zasobw niezbdnych do prezentacji interfejsu uytkownika
z uwzgldnieniem ustawie kraju i jzyka docelowego uytkownika. Warto pamita, e nie
ma adnych ogranicze co do liczby plikw w zestawie. Na rysunku 1.6 przedstawiono struktur wieloplikowego zestawu .NET.
Przedstawiony diagram wieloplikowego zestawu pokazuje wyranie, e manifest zestawu zawiera informacje identyfikujce wszystkie pliki wchodzce w skad tego zestawu.

38

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET

Rysunek 1.6.
Zestaw
wieloplikowy

Chocia wikszo zestaww skada si z pojedynczego pliku, istnieje przynajmniej kilka


przypadkw, w ktrych lepszym rozwizaniem jest stosowanie zestaww wieloplikowych:
n

Zestawy wieloplikowe umoliwiaj czenie moduw przygotowanych w rnych


jzykach programowania. Programici zaangaowani w prace nad oprogramowaniem
mog korzysta z jzyka Visual Basic.NET do byskawicznego wytwarzania aplikacji
(ang. Rapid Application Development RAD) oraz z jzyka C# do budowy
komponentw lub rozwiza korporacyjnych. Kod stworzony w obu jzykach
moe nie tylko wspistnie, ale te efektywnie wsppracowa w ramach jednego
zestawu .NET.

Moduy kodu mona podzieli w sposb pozwalajcy zoptymalizowa proces


wczytywania kodu przez wsplne rodowisko uruchomieniowe (CLR). Wzajemnie
powizany i czsto wykorzystywany kod powinien si znale w jednym module,
natomiast kod, z ktrego korzystamy stosunkowo rzadko, powinien trafi do innego
moduu. rodowisko CLR nigdy nie wczytuje moduw do momentu, w ktrym
rzeczywicie bd potrzebne. Tworzc bibliotek klas, powiniene i krok dalej
i pogrupowa komponenty wedug cyklu ycia, wersji i zabezpiecze (by moe
rnice w tych obszarach bd uzasadniay podzia klas pomidzy wiele zestaww).

Pliki zasobw mog tworzy wasny modu, ktry bdzie odseparowany od moduw
jzyka poredniego (IL). Takie rozwizanie uatwi korzystanie ze wsplnych zasobw
przez wiele aplikacji.

Wieloplikowe zestawy mona tworzy albo za pomoc kompilatora C# uruchamianego z poziomu wiersza polece, albo za pomoc narzdzia czcego zestawy .NET, czyli Assembly
Linkera, Al.exe. W ostatnim podrozdziale tego rozdziau przedstawiono przykad uycia do
tego celu kompilatora jzyka C#. Warto pamita, e w rodowisku Visual Studio.NET 2005
tworzenie wieloplikowych zestaww nie jest obsugiwane.

Zestawy prywatne i wspdzielone


Zestawy mog by wdraane na dwa sposoby: jako struktury prywatne lub struktury globalne. Zestawy znajdujce si w katalogu bazowym aplikacji lub w jego podkatalogach s
nazywane zestawami wdraanymi prywatnie lub po prostu zestawami prywatnymi (ang.
privately deployed assemblies). Instalacja i aktualizacja zestaww prywatnych nie mogaby

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

39

by atwiejsza zwykle wymaga tylko skopiowania zestawu do katalogu bazowego, nazwanego AppBase, w ktrym znajduje si dana aplikacja. Nie s wymagane adne zmiany
w ustawieniach rejestru. Co wicej, istnieje moliwo dodania pliku konfiguracyjnego aplikacji, ktry przykryje ustawienia zapisane w manifecie i umoliwi przenoszenie plikw zestaww w ramach katalogu AppBase.
Zestawy wspdzielone to takie, ktre s instalowane w lokalizacji globalnej, nazywanej globaln pamici podrczn zestaww (ang. Global Assembly Cache GAC), skd s udostpniane wielu aplikacjom. Najwaniejsz zalet globalnej pamici podrcznej zestaww
jest moliwo rwnoczesnego korzystania z wielu wersji tych samych zestaww. Waciwa
realizacja tej koncepcji wymagaa od twrcw technologii .NET wyeliminowania problemu
konfliktw nazw, ktry jest prawdziw plag w tradycyjnych bibliotekach DLL zdecydowano si na uycie a czterech rnych atrybutw identyfikujcych zestawy: nazwy pliku,
ustawie kulturowych (regionalnych), numeru wersji oraz tokenu klucza publicznego.
Publiczne zestawy zwykle s skadowane w katalogu assembly zlokalizowanym gdzie wewntrz katalogu systemu operacyjnego (czyli np. wewntrz katalogu WINNT\ w przypadku
systemu Microsoft Windows 2000). Na rysunku 1.7 przedstawiono zrzut ekranu, ktry dobrze ilustruje specjalny format wywietlania wszystkich czterech atrybutw (platforma .NET
zawiera plik DLL, ktry rozszerza funkcjonalno Eksploratora Windows o mechanizmy
prezentacji zawartoci pamici podrcznej GAC). Przyjrzyjmy si teraz kademu z tych czterech atrybutw.

Rysunek 1.7. Fragment listy zestaww wchodzcych w skad globalnego katalogu zestaww

Nazwa zestawu. Nazywana take przyjazn nazw (ang. friendly name), ma posta
nazwy pliku bez rozszerzenia.
Wersja. Kady zestaw ma przypisany numer wersji, ktry jest stosowany dla
wszystkich plikw wchodzcych w skad tego zestawu. Numer wersji skada si
z czterech liczb w nastpujcym formacie:
<numer gwny>.<numer dodatkowy>.<kompilacja>.<poprawka>
Gwne i dodatkowe numery wersji zwykle s aktualizowane w przypadku
wprowadzenia zmian, ktre zrywaj zgodno wstecz (z wczeniejszymi wersjami).
Numery wersji mona przypisywa do zestaww, doczajc w ich kodzie rdowym
atrybut AssemblyVersion.

40

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


Ustawienia regionalne. Zawarto zestawu mona przypisa do okrelonej kultury
lub jzyka. Istnieje specjalny, dwuliterowy kod, w ktrym "en" oznacza jzyk
angielski, natomiast "fr" wskazuje na jzyk francuski tego rodzaju kody
mona przypisywa do zestaww, umieszczajc w kodzie rdowym atrybut
AssemblyCulture:
[assembly: AssemblyCulture ("fr-CA")]

Token klucza publicznego. Aby zapewni unikatowo i autentyczno


wspdzielonych zestaww, rodowisko .NET wymaga od ich twrcw oznaczania
zestaww za pomoc tzw. silnych nazw (ang. strong names). Proces przypisywania
takich nazw, nazywany podpisywaniem zestaww (ang. signing), wymaga stosowania
par kluczy publicznych i prywatnych. Kiedy kompilator buduje dany zestaw,
wykorzystuje klucz prywatny do wygenerowania silnej nazwy. Klucz publiczny
jest na tyle duy, e konieczne jest utworzenie specjalnego tokenu (reprezentacji
symbolicznej) przez zakodowanie za pomoc funkcji mieszajcej caego klucza
i wybraniu tylko ostatnich omiu bajtw. Tak utworzony token jest nastpnie
umieszczany w manifecie kadego zestawu klienckiego, ktry odwouje si
do odpowiedniego zestawu wspdzielonego, i jest wykorzystywany do identyfikacji
tego zestawu w czasie wykonywania.
Zestaw .NET, ktry oznaczono (podpisano) za pomoc kluczy publicznego i prywatnego, jest
okrelany mianem zestawu z siln nazw lub silnie nazwanego zestawu. Wszystkie zestawy wspdzielone musz mie przypisane silne nazwy.

Prekompilacja zestawu
Po wczytaniu zestawu naley skompilowa kod jzyka poredniego do postaci rdzennego kodu maszynowego. Jeli masz ju dowiadczenie w pracy z plikami wykonywalnymi w formacie kodu maszynowego, zapewne bdzie Ci interesowaa wydajno tego rozwizania
i ewentualnie moliwo tworzenia odpowiednikw plikw wykonywalnych w rodowisku .NET. Odpowied na drugie pytanie brzmi: tak technologia .NET przewiduje moliwo prekompilowania zestaww.
Platforma .NET Framework zawiera narzdzie generatora rdzennych obrazw (ang. Native
Image Generator, Ngen), ktre umoliwia kompilowanie zestaww do postaci rdzennych
obrazw skadowanych w specjalnej pamici podrcznej zarezerwowanym obszarze
wspominanej ju pamici podrcznej GAC. Za kadym razem, gdy wsplne rodowisko uruchomieniowe (CLR) wczytuje zestaw, przeszukuje t pami podrczn pod ktem ewentualnej dostpnoci rdzennego obrazu; jeli znajdzie taki obraz, wczytuje wanie prekompilowany kod. Na pierwszy rzut oka wydaje si, e takie rozwizanie jest korzystne pod wzgldem
wydajnoci. W rzeczywistoci opisana strategia ma jednak wiele powanych wad.
Narzdzie Ngen tworzy obraz dla hipotetycznej architektury sprztowej, dziki czemu bdzie go mona uruchomi np. na dowolnym komputerze z procesorem x86. Zupenie inaczej dziaa kompilator JIT w rodowisku .NET, ktry dysponuje niezbdn wiedz o komputerze docelowym kompilacji i moe odpowiednio dostosowa podejmowane dziaania

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

41

optymalizacyjne. Efekt jest taki, e wersje generowane przez ten kompilator czsto przewyszaj pod wzgldem wydajnoci prekompilowane zestawy. Kolejn wad rdzennych obrazw jest ryzyko dezaktualizacji prekompilowanych zestaww wskutek zmian w konfiguracji sprztowej lub w systemie operacyjnym, np. w wyniku zainstalowania aktualizacji.
Dynamicznie kompilowane zestawy z reguy s pod wzgldem wydajnoci lepsze lub rwne
prekompilowanym plikom wykonywalnym wygenerowanym przez narzdzie Ngen.

Weryfikacja kodu
W ramach procesu kompilacji JIT wsplne rodowisko uruchomieniowe (CLR) przeprowadza dwa rodzaje weryfikacji: weryfikacj kodu jzyka poredniego oraz test poprawnoci metadanych. Celem tych dziaa jest sprawdzenie, czy odpowiedni kod faktycznie gwarantuje bezpieczestwo typw (ang. type safety). W praktyce chodzi o upewnienie si, e
typy parametrw w metodzie wywoujcej i metodzie wywoywanej s ze sob zgodne oraz
e wartoci zwracane przez dan metod s zawsze zgodne z typem zadeklarowanym w deklaracji tej metody. Krtko mwic, wsplne rodowisko uruchomieniowe (CLR) przeszukuje kod jzyka poredniego (IL) pod ktem zgodnoci wartoci przypisywanych do zmiennych z typami tych zmiennych; jeli zostanie wykryta niezgodno w tym zakresie, kompilacja
JIT zakoczy si wygenerowaniem stosownego wyjtku.
Kod generowany przez kompilator C# domylnie zapewnia bezpieczestwo typw. Istnieje
jednak sowo kluczowe unsafe, za pomoc ktrego moemy na poziomie programu napisanego w tym jzyku osabi restrykcje w zakresie dostpu do danych (wcznie z dopuszczeniem moliwoci stosowania odwoa wykraczajcych poza granice tablic).

Zalet takiej weryfikacji jest pewno, e wykonywanie danego kodu nie bdzie miao negatywnego wpywu na funkcjonowanie pozostaych aplikacji wskutek uzyskiwania dostpu
do pamici spoza przydzielonego obszaru. Oznacza to, e rodowisko CLR moe bezpiecznie uruchamia wiele aplikacji w ramach jednego procesu lub przestrzeni adresowej, co
z kolei przekada si na lepsz wydajno i niszy poziom wykorzystania zasobw systemu
operacyjnego.

Biblioteka klas platformy (FCL) jest zbiorem klas i innych typw (typw wyliczeniowych,
struktur i interfejsw), ktre s dostpne dla zarzdzanego kodu napisanego w dowolnym
jzyku zgodnym ze specyfikacj wsplnego rodowiska uruchomieniowego (CLR). Jest
to o tyle wane, e eliminuje znan z innych technologii konieczno wizania bibliotek
z konkretnymi kompilatorami. Programista, ktry raz zapozna si z typami udostpnianymi
przez t bibliotek, bdzie mg t wiedz wykorzystywa podczas pracy z dowolnym wybranym przez siebie jzykiem programowania zgodnym z technologi .NET.

42

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


Zasoby w ramach biblioteki FCL podzielono pomidzy logiczne grupy nazwane przestrzeniami nazw (ang. namespaces). W wikszoci przypadkw zakres funkcjonalnoci tych
grup jest do szeroki. Przykadowo typy wykorzystywane w operacjach graficznych pogrupowano w ramach przestrzeni nazw System.Drawing i System.Drawing.Drawing2D, natomiast
typy niezbdne do wykonywania operacji wejcia-wyjcia na plikach umieszczono w przestrzeni nazw System.IO. Warto pamita, e przestrzenie nazw reprezentuj logiczny podzia
typw, a nie fizyczny.
Biblioteka FCL skada si z setek zestaww (w postaci plikw DLL), z ktrych kady moe
zawiera wiele przestrzeni nazw. Co wicej, pojedyncza przestrze nazw moe obejmowa
wiele zestaww. Aby lepiej zrozumie struktur biblioteki FCL, przeanalizujmy przykadowy
zestaw tej biblioteki (patrz rysunek 1.8).

Rysunek 1.8.
Fragment
danych wynikowych
wywietlonych
przez program
Ildasm lista
przestrzeni
nazw i typw
skadajcych si
na dany zestaw

Na rysunku 1.8 przedstawiono fragment danych wyjciowych wygenerowanych przez narzdzie Ildasm.exe na ich podstawie moemy przeanalizowa zawarto zestawu mscorlib.
Chocia zaprezentowana lista obejmuje tylko cz skadnikw tego zestawu, moemy si
przekona, e zestaw mscorlib zawiera niezwykle wan przestrze nazw System, ktra peni
funkcj repozytorium dla typw decydujcych o podstawowej funkcjonalnoci technologii
.NET. Zestaw mscorlib zawiera te przestrze nazw System.Collection, ktra jak sama
nazwa wskazuje obejmuje klasy i interfejsy wykorzystywane podczas przetwarzania kolekcji danych.
W tabeli 1.2 wymieniono kilkanacie najwaniejszych przestrzeni nazw biblioteki FCL platformy .NET. W ostatniej kolumnie zawarto numery rozdziaw tej ksiki, w ktrych znajdziesz przykady zastosowa odpowiednich przestrzeni nazw.
Przestrzenie nazw stanowi swoist map drogow dla programistw przegldajcych bibliotek FCL w poszukiwaniu niezbdnych klas i interfejsw. Przykadowo, jeli budowana
aplikacja ma wykorzystywa interfejs oparty na stronach WWW, zapewne najbardziej bd
nas interesoway typy przestrzeni nazw System.Web.*. Kiedy nauczysz si podstaw technologii .NET i zdobdziesz dowiadczenie w pracy z jzykiem programowania C#, odkryjesz,
e najwikszym wyzwaniem jest wanie zapoznawanie si z wbudowanymi typami zawartymi
w bibliotece klas platformy (FCL).

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

43

Tabela 1.2. Wybrane przestrzenie nazw biblioteki FCL


Przestrze nazw

Zastosowania

Rozdzia

System

Zawiera podstawowe typy danych wykorzystywane przez


wszystkie aplikacje. Przestrze nazw System zawiera te
klasy wyjtkw, predefiniowane atrybuty, bibliotek Math
oraz klasy odpowiedzialne za zarzdzanie rodowiskiem
aplikacji.

3., 18.

System.Collections

Zawiera interfejsy i klasy wykorzystywane do zarzdzania


kolekcjami obiektw. Do kolekcji obsugiwanych przez
t przestrze nazw nale ArrayList, Hashtable i Stack.

4.

Zawiera klasy wykorzystywane podczas wykonywania


operacji na bazach danych (ADO.NET). Za obsug
systemw zarzdzania bazami danych Oracle i SQL Server
odpowiadaj klienckie przestrzenie nazw, odpowiednio
OracleClient i SSlClient, natomiast przestrzenie OleDb
i Odbc definiuj operacje na poczeniach z bazami danych.

11., 12.

System.Diagnostics

Zawiera klasy, ktre mog by wykorzystywane do ledzenia


wykonywania programu, diagnozowania oraz przetwarzania
systemowych dziennikw zdarze i licznikw wydajnoci.

13.

System.Drawing

Oferuje funkcjonalno graficzn dla interfejsu


programowego GDI+. Wymienione przestrzenie
nazw zawieraj klasy obsugujce zarwno rysowanie,
jak i korzystanie z rozmaitych pir, pdzli, ksztatw
geometrycznych i czcionek.

8., 9.

System.Globalization

Zawiera klasy definiujce informacje zwizane


z ustawieniami regionalnymi, czyli sposobem
reprezentowania dat, kwot pieninych i symbolami walut.

5.

System.IO

Definiuje operacje wejcia-wyjcia na plikach i strumieniach


danych. Za pomoc tych klas mona uzyskiwa dostp
do systemu plikw obsugiwanego przez wykorzystywany
system operacyjny.

5.

System.Net

Zawiera klasy obsugujce protokoy sieciowe i operacje


w rodowiskach sieciowych. Przykadowo, przestrze
nazw System.Net definiuje klasy WebReSuest i WebResponse,
ktre reprezentuj odpowiednio danie i odpowied przy
pobraniu strony WWW.

17.

System.Reflection

Zawiera typy, dziki ktrym mona w czasie wykonywania 7., 15.,


aplikacji przetwarza jej metadane. Przestrze nazw Emit
dodatek B
umoliwia dynamiczne generowanie metadanych i kodu
jzyka poredniego (IL) za pomoc kompilatora lub innego
narzdzia.

System.Collections.Specialized
System.Collections.Generic
System.Data
System.Data.OracleClient
System.Data.SSlClient
System.Data.OleDb
System.Data.Odbc

System.Drawing.Drawing2D
System.Drawing.Printing
System.Drawing.Text

System.Reflection.Emit

System.Runtime.InterOpServices

Zapewnia moliwo wsppracy pomidzy zarzdzanym


i niezarzdzanym kodem, w tym tradycyjnymi bibliotekami
DLL i obiektami COM.

8.

44

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET

Tabela 1.2. Wybrane przestrzenie nazw biblioteki FCL (cig dalszy)


Przestrze nazw

Zastosowania

Rozdzia

System.Security

Zawiera klasy odpowiedzialne za zarzdzanie


bezpieczestwem w rodowisku .NET. Definiuje
klasy kontrolujce dostp do operacji i zasobw.

5., 15.

System.Text.RegularExpressions

Zawiera klasy obsugujce wchodzcy w skad rodowiska


.NET modu przetwarzania wyrae regularnych.

5.

System.Threading

Zarzdza caym cyklem ycia wtkw tworzeniem


wtkw, synchronizacj pracy wtkw oraz dostpem
do puli wtkw.

13.

Zawiera klasy wykorzystywane do rozmaitych dziaa


w ramach aplikacji internetowych (oferowane klasy
cznie s nazywane technologi ASP.NET). Klasy
przestrzeni nazw System.Web zarzdzaj komunikacj
na linii przegldarka-serwer, przetwarzaj znaczniki
kontekstu uytkownika oraz zawieraj kontrolki, ktre
poprawiaj wygld i funkcjonalno stron internetowych.

16., 17.,
18.

System.Security.Permissions
System.Security.Cryptography

System.Threading.Thread
System.Web
System.Web.Services
System.Web.UI
System.Web.UI.WebControls
System.Web.Security

Przestrze nazw Web.Services zawiera klasy wymagane


do przesyania komunikatw XML za porednictwem
protokou SOAP.
Przestrze nazw Web.UI zawiera klasy i interfejsy
wykorzystywane do tworzenia kontrolek i stron internetowych
skadajcych si na formularze WWW.
System.Windows.Forms

Zawiera klasy wykorzystywane do budowy graficznego


interfejsu uytkownika dla aplikacji systemu Windows.
Przestrze nazw Forms oferuje takie kontrolki jak ListBox,
TextBox czy DataGrid.

6., 7.

System.Xml

Typy niezbdne do przetwarzania danych w formacie XML.

10.

Zestaw narzdzi .NET Framework Software Development Kit (SDK) zawiera narzdzia, kompilatory i dokumentacj niezbdn do tworzenia oprogramowania, ktre bdzie prawidowo
dziaao na kadym komputerze z zainstalowan platform .NET Framework. Wersj instalacyjn dla systemw Windows XP, Windows 2000, Windows Server 2003 i wszystkich nowszych wersji systemu operacyjnego Windows mona pobra za darmo z witryny internetowej
firmy Microsoft (zajmuje okoo 100 megabajtw). Jeli masz ju zainstalowane rodowisko
Visual Studio .NET, nie bdziesz musia pobiera tego zestawu narzdzi, poniewa VS .NET
instaluje je automatycznie.

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

45

Uytkownicy oprogramowania zbudowanego z wykorzystaniem zestawu narzdzi .NET Framework SDK nie musz tego zestawu instalowa na swoich komputerach, powinni natomiast
dysponowa odpowiedni (zgodn) wersj platformy .NET Framework. Na witrynie internetowej firmy Microsoft3 udostpniono darmowy pakiet .NET Framework Redistributable
(zajmuje ponad 20 megabajtw) naley go zainstalowa na wszystkich komputerach,
ktrych uytkownicy bd korzystali z aplikacji opracowanych w technologii .NET. Poza
systemami wymienionymi przy okazji omawiania zestawu narzdzi SDK pakiet .NET Framework Redistributable mona instalowa take w systemach Windows 98 i Windows ME.
Aplikacje .NET bd z drobnymi wyjtkami dziaay identycznie we wszystkich platformach systemw operacyjnych, poniewa ich docelowym otoczeniem jest wsplne rodowisko uruchomieniowe (CLR), a nie system operacyjny. Przed zainstalowaniem pakietu .NET
Framework Redistributable powinnimy si upewni, e nasz system spenia wymagania opisane na witrynie internetowej firmy Microsoft i dotyczce midzy innymi zainstalowanej
przegldarki internetowej Internet Explorer 5.01 lub nowszej.

Aktualizowanie platformy .NET Framework


W przeciwiestwie do wielu innych rodowisk wytwarzania oprogramowania instalowanie
nowej wersji platformy .NET nie stanowi adnego problemu i nie wymaga od uytkownika
wikszego wysiku. Proces instalacji umieszcza zaktualizowan wersj w nowym katalogu,
ktrego nazwa odpowiada danej wersji platformy. Co wane, nie wystpuj adne zalenoci
pomidzy plikami nowszych i starszych wersji tej platformy. Oznacza to, e wszystkie wersje
zainstalowane w naszym systemie s w peni funkcjonalne. Najczciej poszczeglne
wersje platformy .NET Framework s skadowane w nastpujcych katalogach (cieki mog
si oczywicie rni w zalenoci od systemu i zainstalowanych wersji):
\winnt\Microsoft.NET\Framework\v1.0.3705
\winnt\Microsoft.NET\Framework\v1.1.4322
\winnt\Microsoft.NET\Framework\v2.0.40607
Kada instalacja nowej wersji oprogramowania platformy rodzi pytania o jej zgodno
z aplikacjami opracowanymi z wykorzystaniem starszych wersji. Okazuje si, e twrcy
technologii .NET znaleli rozwizanie uatwiajce uruchamianie istniejcych aplikacji na dowolnej wersji platformy .NET. Kluczowym rozwizaniem jest plik konfiguracyjny aplikacji
(ang. application configuration file szczegowe omwienie tego rodzaju plikw znajdziesz w rozdziale 15.). Jest to plik tekstowy zawierajcy znaczniki i elementy w formacie
XML, ktre instruuj wsplne rodowisko uruchomieniowe (CLR) o waciwym sposobie
wykonywania danej aplikacji. Plik konfiguracyjny aplikacji moe okrela pooenie zewntrznych zestaww, wersje tych zestaww oraz wersje platformy .NET Framework obsugiwane przez poszczeglne aplikacje i (lub) komponenty. Chocia pliki konfiguracyjne mona przygotowywa w dowolnym edytorze tekstu, duo lepszym rozwizaniem jest uycie
narzdzi specjalnie zaprojektowanych z myl o tym zadaniu (np. Framework Configuration).
Pliki konfiguracyjne bdziemy wykorzystywali przede wszystkim do testowania aplikacji
3

Patrz strona internetowa http://msdn.microsoft.com/netframework/downloads/updates/default.aspx.

46

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


pod ktem ich zgodnoci z nowymi wersjami platformy .NET. Chocia teoretycznie jest to
moliwe, uruchamianie aplikacji w wersjach starszych od tej, w ktrej t aplikacje skompilowano, zwykle nie ma sensu.

Narzdzia platformy .NET Framework


Platforma .NET Framework automatyzuje moliwie du cz zada i w wielu przypadkach skutecznie ukrywa przed programist szczegy stosowanych rozwiza. Istniej jednak sytuacje, w ktrych interwencja programisty jest absolutnie konieczna. Odpowiednie
dziaania mog wymaga doskonaej znajomoci szczegw funkcjonowania zestawu oraz
dowiadczenia w przygotowywaniu aplikacji do wdroenia. Podczas pracy z technologi .NET
odkrylimy wiele przykadw tego rodzaju zada. Udzia programisty bdzie nieodzowny
podczas realizacji nastpujcych zada:
n

dodawania pliku do zestawu,

przegldania zawartoci zestawu,

przegldania szczegowych informacji o konkretnej klasie,

generowania pary kluczy publicznych i prywatnych celem utworzenia silnie


nazwanego zestawu,

edycji plikw konfiguracyjnych.

Wiele z tych zada bardziej lub mniej szczegowo omwimy w kolejnych rozdziaach.
Warto jednak mie wiadomo istnienia narzdzi, ktre uatwiaj wykonywanie odpowiednich dziaa sztuk efektywnego korzystania z czci tych narzdzi (szczeglnie tych
wspierajcych przegldanie klas i zestaww) naley opanowa ju na wczesnych etapach
poznawania technologii .NET.
W tabeli 1.3 wymieniono i krtko opisano kilka najbardziej przydatnych narzdzi platformy .NET Framework, ktre uatwiaj wytwarzanie i wdraanie aplikacji. Trzy narzdzia,
Ildasm.exe, wincv.exe i .NET Framework Configuration szczegowo omwimy w dalszej
czci tego rozdziau.
Wiele spord opisanych powyej katalogw znajduje si w nastpujcym podkatalogu zestawu narzdzi .NET Framework SDK:
c:\Program Files\Microsoft.NET\SDK\v2.0\Bin
Uruchamianie wymienionych przed chwil narzdzi w wierszu polece systemu operacyjnego Windows (z dowolnego katalogu) wymaga w pierwszej kolejnoci dopisania cieki do
odpowiednich plikw wykonywalnych w zmiennej systemowej Path. Aby to zrobi, naley
wykona nastpujce kroki:
1. Kliknij prawym przyciskiem myszy ikon Mj komputer i z wywietlonego

menu kontekstowego wybierz opcj Waciwoci.


2. Kliknij zakadk Zaawansowane i przycisk Zmienne rodowiskowe.
3. Zaznacz zmienn Path i dodaj do niej ciek do odpowiedniego podkatalogu

zestawu narzdzi SDK.

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

47

Tabela 1.3. Wybrane narzdzia platformy .NET Framework


Narzdzie

Opis

Al.exe
Assembly Linker

Narzdzia Assembly Linker mona uywa do tworzenia zestaww


zoonych z moduw wygenerowanych przez rne kompilatory.
Assembly Linker jest wykorzystywany take do budowy zestaww
obejmujcych same zasoby (tzw. zestaww satelickich).

Fuslogvw.exe
Assembly Binding Log Viewer

Narzdzie Assembly Binding Log Viewer jest wykorzystywane


najczciej wtedy, gdy w procesie wczytywania zestaww wystpi
jakie problemy. Pozwala skutecznie ledzi kroki skadajce si
na prby wczytania zestawu.

Gacutil.exe
Narzdzie Global Assembly
Cache

Narzdzie jest wykorzystywane do instalowania lub usuwania


zestaww z globalnej pamici podrcznej zestaww (GAC).

Ildasm.exe
MSIL Disassembler

Narzdzie MSIL Disassembler suy do przegldania zestaww,


w tym kodu jzyka poredniego (IL) oraz metadanych.

Mscorcfg.msc
Narzdzie .NET Framework
Configuration

Doczone narzdzie Microsoft Management Console (MMC)


zaprojektowano z myl o konfigurowaniu zestaww bez koniecznoci
samodzielnego wprowadzania zmian w plikach konfiguracyjnych
aplikacji. Dodatkowy skadnik tego narzdzia, Framework Wizards,
stworzono przede wszystkim dla administratorw, cho jest
wykorzystywany take przez programistw.

Ngen.exe
Native Image Generator

Kompiluje jzyk poredni zestawu do postaci odpowiedniego kodu


maszynowego. Generowany w ten sposb obraz jest nastpnie
umieszczany w pamici podrcznej rdzennych obrazw.

Sn.exe
Narzdzie Strong Name

Generuje klucze, ktre s nastpnie wykorzystywane do tworzenia


silnie nazwanych (podpisanych) zestaww.

wincv.exe
Windows Forms Class Viewer

Interfejs graficzny wywietlajcy i umoliwiajcy przeszukiwanie


informacji o klasie.

Wsdl.exe
Narzdzie Web Services
Description Language

Generuje opisowe informacje o usudze sieciowej (Web Service)


informacje mog by wykorzystywane przez klienta uzyskujcego
dostp do danej usugi.

Jeli masz zainstalowane rodowisko Visual Studio, duo prostszym rozwizaniem bdzie
uycie prekonfigurowanego wiersza polece tego rodowiska. Wiersz polece rodowiska
VS.NET automatycznie inicjalizuje informacje o ciekach, ktre s niezbdne do uzyskiwania dostpu do narzdzi wiersza polece.

Ildasm.exe
Narzdzie Intermediate Language Disassembler (Ildasm), ktre jest czci zestawu narzdzi .NET Framework SDK, zwykle znajduje si w podkatalogu Bin w katalogu, w ktrym
zainstalowano ten zestaw narzdzi. Narzdzie Ildasm jest bezcenn pomoc podczas analizy rodowiska zestaww platformy .NET i jako takie bdzie jednym z pierwszych narzdzi,
z ktrym bdziesz si musia zaznajomi ju na pocztku swojej przygody z zestawami .NET.

48

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


Najprostszym sposobem uycia narzdzia Intermediate Language Disassembler jest wpisanie w wierszu polece nastpujcego wyraenia:
C:\>Ildasm /adv

Opcjonalny przecznik /adv powoduje, e bd dostpne zaawansowane opcje wywietlania. Wykonanie tego polecenia wywoa graficzny interfejs uytkownika (GUI) z menu File,
w ktrym bdziemy mogli wybra interesujcy nas zestaw. Warto pamita, e narzdzie
Ildasm nie otwiera plikw skadowanych w pamici podrcznej zestaww (GAC).
Na rysunku 1.9 przedstawiono przykad danych wyjciowych wywietlonych przez narzdzie Ildasm po wybraniu jednego z zestaww. Zawarto zestawu jest prezentowana w czytelnym, hierarchicznym formacie zawierajcym nazw zestawu, w tym przypadku corecsharp1,
oraz wszystkie jego skadniki.
Rysunek 1.9.
Zawarto
wybranego zestawu
wywietlona
przez narzdzie
Ildasm.exe

Uytkownik narzdzia moe wej w gb tej hierarchii, aby zapozna si z reprezentowanym przez poszczeglne skadniki kodem jzyka poredniego IL (lub wsplnego jzyka
poredniego CIL). Z rysunku 1.9 wynika, e zestaw corecsharp1 skada si z trzech
metod: Metric, conversion i metric. Potwierdza to oryginalny kod klasy Conversion napisany w jzyku C#:
public class Conversion
{
public double Metric( double inches)
{ return (2.54 * inches); }
[CLSCompliantAttribute(false)]
public double metric( double miles)
{ return (miles / 0.62); }
public double conversion( double pounds)
{ return (pounds * 454); }
}

Dwukrotne kliknicie metody Metric spowoduje wywietlenie ekranu z kodem jzyka poredniego (IL) tej metody patrz rysunek 1.10.
Narzdzie Ildasm moe by wykorzystywane do nauki i eksperymentowania z koncepcj
jzyka poredniego i zestaww. Program znajduje te wane zastosowania praktyczne.
Przypumy, e dysponujemy komponentem (zestawem .NET) opracowanym przez kogo

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

49

Rysunek 1.10.
Widok kodu jzyka
poredniego (IL)

innego, i e nie posiadamy adnej dokumentacji na jego temat. W takich przypadkach poszukiwanie szczegw na temat interfejsu tego zestawu powinnimy rozpocz wanie od
jego otwarcia w narzdziu Ildasm.
Narzdzie Ildasm zawiera w menu File opcj Dump, za pomoc ktrej moemy zapisa
dokumentacj programu w pliku tekstowym. Aby utworzy dugi, ale czytelny dokument
o metadanych danego zestawu, wybierz opcj Dump Metainfo; aby zapozna si z profilem zestawu wcznie z liczb bajtw wykorzystywanych przez poszczeglne skadniki,
wybierz opcj Dump Statistics.

Narzdzie Ildasm i zaciemnianie kodu


Jednym z naturalnych odruchw programistw aplikacji .NET jest pytanie o sposb ochrony ich wasnoci intelektualnej w sytuacji, gdy istniej takie narzdzia jak Ildasm (i inne
komercyjne programy odwracajce kompilacj), ktre mog by wykorzystywane do odtwarzania oryginalnego kodu na podstawie skompilowanych zestaww. Jednym z rozwiza jest technika nazywana zaciemnianiem kodu (ang. obfuscation), ktra polega na zrcznym modyfikowaniu nazw i innych operacjach na kodzie skutecznie uniemoliwiajcych
jego odczytywanie przez ludzi.
Naley pamita, e zaciemnianie kodu nie jest tosame z jego szyfrowaniem. Szyfrowanie
wymagaoby wykonywania dodatkowego kroku odszyfrowywania przed przetworzeniem
kodu przez kompilator JIT. Zaciemnianie polega na transformacji kodu jzyka poredniego
do postaci, w ktrej mona go skompilowa za pomoc standardowych narzdzi rodowisk
wytwarzania oprogramowania (patrz rysunek 1.11).
Rysunek 1.11.
Zaciemnianie
kodu skutecznie
ukrywa oryginalny
kod jzyka
poredniego (IL)

50

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


Zaciemniony kod funkcjonalnie nie odbiega od oryginalnego kodu jzyka poredniego danego zestawu i podczas wykonywania we wsplnym rodowisku uruchomieniowym (CLR)
generuje identyczne wyniki. Jak to moliwe? Ot typowym dziaaniem w ramach zaciemniania kodu jest zamiana czytelnych nazw typw i skadowych na nazwy, ktre czytelnikowi takiego kodu niczego nie mwi. Przykadowo, kiedy zajrzysz do zaciemnionego kodu,
znajdziesz tam mnstwo typw nazwanych a lub b. Algorytm zaciemniania musi oczywicie by na tyle inteligentny, by nie zmienia nazw typw wykorzystywanych poza modyfikowanym zestawem, poniewa kada taka zmiana uniemoliwiaby prawidowe odwoania
do tych typw. Innym typowym rozwizaniem jest modyfikowanie przepywu sterowania
(ang. control flow) w sposb, ktry nie zmienia logiki dziaania programu. Przykadowo,
wyraenie while mona zastpi kombinacj wyrae goto oraz if.
Zestaw narzdzi .NET Framework SDK nie zawiera wasnego mechanizmu zaciemniania
kodu. rodowisko programowania Visual Studio .NET jest oferowane wraz z narzdziem
Dotfuscator Community Edition, czyli wersj komercyjnego produktu Dotfuscator z nieco
ograniczon funkcjonalnoci. Chocia wspomniane narzdzie nie jest specjalnie wyrafinowane i dziaa wycznie w rodowiskach firmy Microsoft, warto wanie od niego rozpocz
poznawanie tego ciekawego procesu. Wielu producentw oferuje bardziej zaawansowane produkty w tym zakresie.

wincv.exe
WinCV jest przegldark klas analogiczn do narzdzia Visual Studio Object Viewer oferowan w ramach rodowiska VS .NET. Program znajduje si w katalogu Program Files\
Microsoft.NET\SDK\V1.x\Bin i mona go uruchamia z poziomu wiersza polece. Po wywietleniu okna graficznego interfejsu uytkownika WinCV naley wpisa nazw interesujcej nas klasy w polu tekstowym Searching For (patrz rysunek 1.12).
WinCV oferuje bogaty zasb informacji o wszystkich typach obsugiwanych przez bibliotek klas bazowych. Cztery obszary zaznaczone na rysunku 1.12 pokazuj prbki dostpnych danych:
1. Przedmiotem analizy jest klasa bazowa System.Array.
2. Klasa System.Array jest czci zestawu mscorlib.dll. Wspominalimy ju, e zestaw

mscorlib.dll zawiera najwaniejsze typy zarzdzane platformy .NET.


3. Lista zawiera klas, obiekt i interfejsy dziedziczone przez klas System.Array.
4. Wywietlona reprezentacja zawiera definicj kadej z metod tej klasy, ktra obejmuje

uprawnienia dostpu, typ oraz parametry definicja w tej postaci jest nazywana
sygnatur metody.

Narzdzie Framework Configuration


Narzdzie Framework Configuration oferuje proste rozwizania w zakresie zarzdzania i konfiguracji zestaww oraz ustawiania zabezpiecze w dostpie do kodu. Narzdzie jest czci
konsoli Microsoft Management Console (MMC). Aby je uruchomi, w Panelu sterowania

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

51

Rysunek 1.12. Przykad uycia narzdzia WinCV do przegldania definicji typu klasy Array

kliknij ikon Narzdzia administracyjne i wybierz skrt Microsoft .NET Framework Konfiguracja. Program Framework Configuration stworzono z myl o administratorach, ktrzy
musz wykonywa nastpujce zadania:
n

Zarzdzanie zestawami. Zestawy mog by dodawane lub usuwane z pamici


podrcznej GAC.

Konfigurowanie zestaww. W razie aktualizacji zestawu osoba, ktra go


opublikowaa, jest odpowiedzialna za odpowiednie dostosowanie regu wizania
(ang. binding policy) tego zestawu. Na podstawie tych regu wsplne rodowisko
uruchomieniowe okrela waciw wersj wczytywanego zestawu w odpowiedzi
na wykryte odwoanie do zestawu w ktrej z wykonywanych aplikacji. Przykadowo,
jeli zestaw w wersji 1.1 zastpi zestaw 1.0, reguy doczania powinny tak
przekierowa odwoania do wersji 1.0, aby rodowisko CLR wczytywao wersj 1.1.
Odpowiednie informacje naley umieci w pliku konfiguracyjnym.

Analiza zabezpiecze platformy .NET Framework i modyfikowanie regu


bezpieczestwa zestaww. Mechanizmy zabezpiecze platformy .NET umoliwiaj
przypisywanie poszczeglnym zestawom okrelonych uprawnie dostpu. Co wicej,
docelowy zestaw moe wymaga posiadania uprawnie dostpu od pozostaych
zestaww, ktre daj dostpu do danego zestawu.

Zarzdzanie interakcj poszczeglnych aplikacji z zestawem lub zbiorem


zestaww. Narzdzie Framework Configuration umoliwia przegldanie nie tylko
list wszystkich zestaww wykorzystywanych przez dan aplikacj, ale te kompletnych
zbiorw wykorzystywanych wersji.

52

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


Aby lepiej zilustrowa praktyczne zastosowania tego narzdzia konfiguracyjnego, przeanalizujemy sposb jego uycia do rozwizania jednego z najczstszych problemw napotykanych w procesie wytwarzania oprogramowania koniecznoci powrotu do ostatniej dziaajcej wersji w razie problemw z funkcjonowaniem wersji biecej. Realizacja tego zadania
moe by szczeglnie trudna w sytuacji, gdy aplikacja wykorzystuje po stronie serwera biblioteki DLL lub zestawy. Okazuje si, e twrcom technologii .NET udao si znale do
sprytne rozwizanie za kadym razem, gdy uruchamiamy jak aplikacj, rodowisko
uruchomieniowe zapisuje w dzienniku zdarze informacje o wszystkich wykorzystywanych
zestawach. Jeli wersje tych zestaww nie zmieni si od ostatniego uruchomienia, zostan
zignorowane przez rodowisko CLR; w przeciwnym razie zostanie zachowana migawka
nowego zbioru zestaww.
Kiedy prba uruchomienia aplikacji zakoczy si niepowodzeniem lub aplikacja nie bdzie
dziaaa prawidowo, programista bdzie mg w prosty sposb powrci do wersji zestaww,
ktre nie powodoway podobnych problemw. Narzdzie konfiguracyjne moe posuy do
przekierowania aplikacji do wczeniejszej wersji zaktualizowanego ostatnio zestawu. Przydatno tego rodzaju narzdzi jest szczeglnie widoczna w sytuacji, gdy ewentualny problem
dotyczy wicej ni jednego zestawu programista moe si zapozna z dotychczasowymi
konfiguracjami zestaww i wybra cay zestaw zestaww dla danej aplikacji.
Aby wywietli i ewentualnie wybra poprzednie konfiguracje, w menu narzdzia Framework Configuration kliknij kolejno pozycj Applications i opcj Fix an Application. Na rysunku 1.13 przedstawiono fragmenty obu wywietlonych okien dialogowych. Okno gwne
zawiera list aplikacji, ktrych wykonanie zostao zarejestrowane w dzienniku zdarze.
Mniejsze okno (w tym przypadku obcita cz wikszego okna dialogowego) zostanie wywietlone po klikniciu ktrej z tych aplikacji. Okno zawiera list ostatnich konfiguracji
(maksymalnie piciu) przypisanych do danej aplikacji. Wystarczy wybra konfiguracj zestaww, ktrej chcemy uy dla wskazanej aplikacji.

Rysunek 1.13.
Przykad
uycia narzdzia
konfiguracyjnego
aplikacji
do ustawiania
wersji zestaww

Jak wida, narzdzie konfiguracyjne stworzono przede wszystkim z myl o administratorach. Programici powinni korzysta tylko z wybranych podzbiorw funkcjonalnoci tego
narzdzia zawartych w trzech kreatorach: Dopasuj zabezpieczenia .NET, Ufaj zestawowi
oraz Napraw aplikacj. Dostp do tych kreatorw mona uzyska, klikajc ikon Microsoft
.NET Framework Kreatorzy w Narzdziach administracyjnych.

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

53

Wielu programistw piszcych zoone aplikacje dla platformy .NET wykorzystuje Visual Studio lub jakie inne zintegrowane rodowisko wytwarzania oprogramowania (ang. Integrated
Development Environment IDE) do edycji kodu, doczania zewntrznych zestaww,
diagnozowania aplikacji i generowania ostatecznych, skompilowanych wersji oprogramowania. Jeli i Ty zaliczasz si do tej grupy, znajomo technik korzystania z zestawu narzdzi .NET SDK i podstawowego kompilatora C# najprawdopodobniej nie bdzie Ci potrzebna,
cho z pewnoci podniosaby poziom wiedzy o procesie kompilacji w technologii .NET
i daa lepsze podstawy do pracy z zestawami. Efektem ubocznym korzystania z kompilatora
C# na poziomie wiersza polece byoby te zdobycie cennego dowiadczenia w korzystaniu
z programw wchodzcych w skad zestawu narzdzi SDK. Wiele spord narzdzi zaprezentowanych w poprzednim podrozdziale jest wywoywanych wanie z wiersza polece,
a w niektrych sytuacjach moliwo przeprowadzania procesu kompilacji w takim rodowisku okazuje si kuszc alternatyw dla zaawansowanych mechanizmw rodowisk IDE.
Na rysunku 1.14 przedstawiono podstawowe kroki skadajce si na proces konwertowania
kodu rdowego na ostateczn, skompilowan wersj oprogramowania. Celem niniejszego
podrozdziau jest prezentacja, jak edytor tekstu w poczeniu z kompilatorem C# moe by
wykorzystywany konstruowania aplikacji. Przy okazji przeanalizujemy wiele opcji kompilatora, ktre czsto pozostaj ukryte przed uytkownikami zintegrowanych rodowisk wytwarzania oprogramowania (IDE).
Rysunek 1.14.
Schemat procesu
kompilacji

Lokalizowanie kompilatora
Kompilator jzyka programowania C#, csc.exe, znajduje si w katalogu, w ktrym zainstalowano platform .NET Framework:
C:\winnt\Microsoft.NET\Framework\v2.0.40607
cieka do pliku wykonywalnego kompilatora moe si oczywicie rni w zalenoci od
stosowanego systemu operacyjnego i zainstalowanej wersji platformy .NET Framework.
Aby kompilator C# by dostpny w wierszu polece niezalenie od biecego katalogu,

54

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


powiniene doda t ciek do zmiennej systemowej Path. Odpowiedni procedur opisano w poprzednim podrozdziale przy okazji omawiania cieek dostpu do programw wchodzcych w skad zestawu narzdzi SDK.
Aby si upewni, e kompilator rzeczywicie jest dostpny z dowolnego katalogu, wpisz
w wierszu polece nastpujce wyraenie:
C:\>csc /help

Kompilowanie oprogramowania z poziomu wiersza polece


Aby skompilowa napisan w jzyku C# aplikacj konsoli, nazwan client.cs, do postaci
pliku wykonywalnego client.exe, naley wykona na poziomie wiersza polece jedno z przedstawionych polece:
C:\> csc client.cs
C:\> csc /t:exe client.cs

Oba wyraenia spowoduj, e plik z kodem rdowym zostanie skompilowany do postaci


pliku wykonywalnego z rozszerzeniem .exe, czyli domylnego formatu wyjciowego kompilatora. Typ docelowy mona okreli za pomoc flagi /t: (patrz tabela 1.4). Aby utworzy
plik DLL, naley ustawi dla tej flagi warto library, natomiast aplikacja WinForms bdzie wymagaa uycia flagi /t:winexe. Warto pamita, e jeli tworzc aplikacj WinForms,
uyjemy flagi /t:exe, kompilacja zakoczy si pomylnie, tyle e w czasie wykonywania
aplikacji zostanie wywietlone w tle okno konsoli.
Najwiksz zalet korzystania z podstawowego kompilatora jzyka C# (wywoywanego
z poziomu wiersza polece) jest moliwo pracy z wieloma plikami i zestawami. Aby lepiej
to zilustrowa, napiszemy w jzyku C# dwa proste pliki rdowe: client.cs i clientlib.cs.
client.cs
using System;
public class MyApp
{
static void Main(string[] args)
{
ShowName.ShowMe("Core C#");
}
}

clientlib.cs
using System;
public class ShowName
{
public static void ShowMe(string MyName)
{
Console.WriteLine(MyName);
}
}

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

55

Tabela 1.4. Wybrane opcje kompilatora C# uruchamianego w wierszu polece


Opcja

Opis

/addmodule

Okrela modu, ktry naley doczy do tworzonego zestawu. Jest to najprostszy


sposb tworzenia wieloplikowych zestaww.

/debug

Wymusza wygenerowanie informacji diagnostycznych.

/define

Umoliwia przekazywanie do kompilatora dyrektywy preprocesora: /define:DEBUG.

/delaysign

Kompiluje zestaw z siln nazw, korzystajc z techniki odroczonego podpisywania


(ang. delayed signing patrz rozdzia 15.).

/doc

Suy do wskazywania pliku wyjciowego dla generowanej dokumentacji XML.

/keyfile

Okrela ciek do pliku .snk zawierajcego par kluczy niezbdn do silnego nazwania
danego zestawu (patrz rozdzia 15.).

/lib

Okrela miejsce skadowania doczanych zestaww zewntrznych (wskazanych


w opcji /reference).

/out

Okrela nazw docelowego pliku dla skompilowanej wersji. Nazwa domylna jest taka
sama jak dla pliku wejciowego (rozszerzenie .cs jest zastpowane rozszerzeniem .exe).

/reference (/r)

Odwouje si do zewntrznego zestawu.

/resource

Suy do osadzania plikw zasobw w ramach tworzonego zestawu.

/target (/t)

Okrela typ tworzonego pliku wyjciowego:


/t:exe kompiluje aplikacj konsoli nazwan *.exe. Flaga /t:exe jest domyln
opcj kompilacji.
/t:library kompiluje zestaw nazwany *.dll.
/t:module kompiluje modu (przenony plik wykonywalny), ktry nie zawiera

manifestu.
/t:winexe kompiluje zestaw Windows Forms nazwany *.exe.

Na tym etapie nie ma znaczenia, czy rozumiesz szczegowe konstrukcje jzykowe wystarczy, e bdziesz wiedzia, e kod zawarty w pliku client.cs wywouje funkcj zdefiniowan w pliku clientlib.cs i wywietla otrzyman warto w oknie konsoli. Kompilator C#
oferuje wiele sposobw implementacji tego rodzaju zwizkw, ktre demonstruj nie tylko
podstawowe opcje kompilatora, ale te rzucaj nieco wiata na ogln koncepcj zestaww.

Przykad 1.: kompilacja wielu plikw


Kompilator jzyka C# moe otrzyma na wejciu dowoln liczb plikw rdowych. Wygenerowane dane wyjciowe zostan umieszczone w pojedynczym pliku zestawu:
csc /out:client.exe client.cs clientlib.cs

56

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET

Przykad 2.: tworzenie i uywanie biblioteki klas


Skompilowany kod z pliku rdowego clientlib.cs mona umieci w osobnej bibliotece, ktra bdzie nastpnie udostpniana wszystkim zainteresowanym klientom:
csc /t:library clientlib.cs

W wyniku tej operacji otrzymamy zestaw nazwany clientlib.dll. Moemy teraz skompilowa
kod klienta, stosujc polecenie odwoujce si do tego zewntrznego zestawu:
csc /r:clientlib.dll client.cs

Kompilator wygeneruje zestaw nazwany client.exe. Jeli przeanalizujesz ten zestaw za pomoc narzdzia Ildasm, przekonasz si, e jego manifest zawiera odwoanie do skompilowanego wczeniej zestawu clientlib.dll.

Przykad 3.: tworzenie zestawu wieloplikowego


Zamiast tworzy osobny zestaw, skompilowan wersj kodu zawartego w pliku clientlib.cs
mona umieci wewntrz zestawu client.exe. Poniewa tylko plik w zestawie moe zawiera manifest, w pierwszej kolejnoci bdziemy musieli skompilowa plik clientlib.cs do postaci przenonego moduu wykonywalnego4 (ang. Portable Executable PE). Aby otrzyma taki modu, wystarczy w wywoaniu kompilatora uy opcji /t:module:
csc /t:module clientlib.cs

Plik wyjciowy zostanie nazwany clientlib.netmodule. Mona ten plik umieci w zestawie
client.exe za pomoc przecznika /addmodule kompilatora csc.exe:
csc /addmodule:clientlib.netmodule client.cs

Wynikowy zestaw bdzie si skada z dwch plikw: client.exe i clientlib.netmodule.


Przykady przedstawione na rysunku 1.15 dobrze pokazuj, e nawet w przypadku tak prostej aplikacji programista ma do dyspozycji szereg rozwiza i musi podj waciw decyzj
odnonie architektury implementowanego oprogramowania.
Rysunek 1.15.
Moliwe
rozwizania
w zakresie
wdraania
aplikacji

Format PE definiuje ukad plikw wykonywalnych, ktre mona uruchamia w 32- i 64-bitowych
systemach Windows.

Rozdzia 1. n Wprowadzenie do technologii .NET i jzyka C#

57

Platforma .NET Framework skada si ze wsplnego rodowiska uruchomieniowego (CLR)


i biblioteki klas platformy (FCL). rodowisko CLR zarzdza wszystkimi zadaniami zwizanymi z wykonywaniem kodu aplikacji. Pierwszym zadaniem tego rodowiska jest sprawdzenie, czy uruchamiana aplikacja rzeczywicie jest zgodna ze standardow specyfikacj
wsplnego jzyka (CLS). Bezporednio potem wsplne rodowisko uruchomieniowe wczytuje aplikacj i lokalizuje wszystkie zalene zestawy. Wykorzystywany przez to rodowisko
kompilator JIT (Just-in-Time) konwertuje kod jzyka poredniego zawarty w zestawie aplikacji (najmniejszej jednostce wdroeniowej w technologii .NET) do postaci rdzennego kodu
maszynowego. W czasie waciwego wykonywania programu rodowisko CLR odpowiada za
zapewnianie bezpieczestwa, zarzdzanie wtkami, przydzia pamici oraz zwalnianie pamici nieuywanej (z wykorzystaniem odpowiedniego mechanizmu odzyskiwania pamici).
Cay kod musi by umieszczony w specjalnych zestawach, ktre mog by prawidowo obsugiwane przez wsplne rodowisko uruchomieniowe (CLR). Zestaw moe mie albo posta pojedynczego pliku, albo grupy wielu fizycznych plikw traktowanych jak pojedyncza
jednostka wdroeniowa. Zestaw moe zawiera zarwno moduy kodu, jak i niezbdne pliki zasobw.
Biblioteka FCL zawiera zbir klas i pozostaych typw wielokrotnego uytku, ktre mog
by wykorzystywane przez dowolny zestaw zgodny z wymaganiami wsplnego rodowiska
uruchomieniowego (CLR). Takie rozwizanie eliminuje konieczno stosowania bibliotek
waciwych dla poszczeglnych kompilatorw. Chocia biblioteka FCL skada si z wielu
fizycznych plikw DLL zawierajcych ponad tysic rnych typw, przeszukiwanie tej biblioteki jest stosunkowo proste dziki zastosowaniu przestrzeni nazw, ktre tworz logiczn
hierarchi obejmujc wszystkie obsugiwane typy.
Platforma .NET Framework zawiera szereg przydatnych narzdzi, ktre mog pomc nie
tylko programicie w diagnozowaniu i wdraaniu oprogramowania, ale take administratorowi w realizacji takich zada jak zarzdzanie zestawami, prekompilowanie zestaww, dodawanie nowych plikw do zestaww oraz przegldanie szczegowych informacji o klasach.
Co wicej, istnieje bogaty zbir narzdzi typu open source (oferowanych z otwartym dostpem do kodu rdowego), ktre take mog stanowi cenn pomoc w procesie wytwarzania
oprogramowania dla platformy .NET.

1. Jakie przenone rodowisko naley zainstalowa na komputerze klienta (uytkownika),

aby mona na nim byo uruchomi aplikacj .NET?


2. Czym jest zarzdzany, a czym jest kod niezarzdzany?
3. Jaka jest rnica pomidzy wsplnym systemem typw (CTS) a specyfikacj

wsplnego jzyka (CLS)?

58

Cz I n Podstawy programowania w jzyku C# i wprowadzenie do technologii .NET


4. Jak to moliwe, e we wsplnym rodowisku uruchomieniowym kod

wygenerowany przez rne kompilatory moe ze sob wsppracowa?


5. Jak rol peni globalna pami podrczna zestaww?
6. Wymie cztery skadniki, ktre skadaj si na identyfikator silnie nazwanego

zestawu.
7. Jaka relacja czy przestrze nazw z zestawem .NET?
8. Rozwi i krtko opisz pojcia kryjce si za nastpujcymi akronimami:

CLR, GAC, FCL, IL.

You might also like