Assemblies) są podstawowym budulcem aplikacji środowiska .NET.
W wielu przypadkach kompilat jest po prostu biblioteką dynamiczną .dll albo plikiem wykonywalnym .exe, ale koncepcja kompilatów jest o wiele szersza niż koncepcja plików. Jeden kompilat może rozciągać się na wiele plików, które traktowane są jako jedna całość. Pliki te, traktowane jako jeden kompilat, mają dokładnie te same numery wersji oraz wspólną „strefę prywatną” — w środowisku .NET istnieje szczególny atrybut widoczności o nazwie assembly, umożliwiający dostęp do identyfikatora tylko z wnętrza danego kompilatu.
Co prawda podziały istniejące w kompilatach wpływają przede wszystkim na sposób wykonywania programu, jednak część z nich dotyczy również jego fizycznej struktury (kompilaty ładowane są jako całkowicie niezależne od siebie składniki programu, w związku z czym w czasie aktualizacji oprogramowania mogą być aktualizowane niezależnie od siebie). Istnieje też podział wpływający na logiczną strukturę programu, który największe znaczenie ma w czasie projektowania aplikacji.
Przestrzenie nazw
Przestrzenie nazw (ang. Namespaces) pozwalają na dokonanie podziałów w cały czas rosnących i przez to coraz trudniejszych do ogarnięcia bibliotekach klas. Na przykład klasy przeznaczone do generowania grafiki umieszczone zostały w przestrzeni nazw System.Drawing, natomiast wszystkie kontrolki znane z aplikacji systemu Windows, takie jak kontrolki ListBox lub Button, zapisane są w przestrzeni nazw System.Windows.
Forms. Dostępne są też inne kontrolki, przygotowane specjalnie do wykorzystania w aplikacjach WWW, które również nazywają się ListBox i Button, chociaż są to klasy całkowicie niezależne od klas standardowych kontrolek. Rozróżnienie pomiędzy tymi pierwszymi a tymi drugimi kontrolkami umożliwiają właśnie przestrzenie nazw: System.
Windows.Forms.ListBox to kontrolka listy współdziałająca ze standardowymi aplikacjami działającymi bezpośrednio na komputerze użytkownika i na ekranie wyświetlana jest z wykorzystaniem interfejsu GDI+. Z kolei System.Web.UI.WebControls.ListBox to kontrolka listy współpracująca z aplikacjami WWW działającymi na serwerach WWW, a na komputer użytkownika przenoszona w postaci kodu HTML.
Różnorodność koncepcji przestrzeni nazw i kompilatów polega między innymi na tym, że jedna przestrzeń nazw może w sobie zawierać wiele kompilatów, a każdy z kompilatów może przechowywać w sobie wiele przestrzeni nazw. Mówiąc dokładniej, kompilat nie może w sobie tak naprawdę „zawierać” przestrzeni nazw, ponieważ może być ona rozbudowywana przez inne kompilaty. W związku z tym należałoby powiedzieć, że kompilat może przechowywać nazwy pochodzące z wielu przestrzeni nazw, które z kolei mogą być rozsiane wśród wielu kompilatów.
Hierarchia przestrzeni nazw
Hierarchia przestrzeni nazw budowana jest za pomocą kropek umieszczanych pomiędzy kolejnymi nazwami. Na przykład przestrzeń nazw System.Drawing.Printing podpo-rządkowana jest hierarchicznie przestrzeni nazw System.Drawing, która z kolei podpo-rządkowana jest przestrzeni nazw System. Można też powiedzieć, że nadrzędne przestrzenie nazw zawierają w sobie wszystkie przestrzenie podrzędne.
Rozdział 3. ♦ Język Delphi w środowisku .NET
277
Takie hierarchiczne związki zawierania mają jednak naturę wyłącznie koncepcyjną i mają służyć przede wszystkim ludziom korzystającym ze środowiska .NET, umożliwiając lepszą orientację w jego zawartości. Istnieje na przykład konwencja mówiąca, że podrzędna przestrzeń nazw powinna być zależna od przestrzeni nadrzędnej, ale nie odwrotnie1.
Dla środowiska CLR związki zawierania przestrzeni nazw nie mają żadnego znaczenia.
Zawierane przestrzenie nazw mogą być zapisywane w osobnych kompilatach, niezależnych od nadrzędnej przestrzeni nazw, a takie kompilaty mogą być instalowane, ładowane i usuwane całkowicie niezależnie od kompilatów nadrzędnej przestrzeni nazw.
Najczęściej jednak podrzędna przestrzeń nazw wykorzystuje elementy z przestrzeni nadrzędnej, a odpowiednie kompilaty mogą być załadowane tylko wtedy, gdy dostępne są też kompilaty nadrzędnej przestrzeni nazw. Ta zależność nie jest jednak definiowana przez nazwy przestrzeni nazw, ale przez bezpośrednie instrukcje nakazujące włączenie danej przestrzeni nazw (w języku C# instrukcja ta nazywa się using, a w Delphi — uses).
Kod zarządzany i CLR