Wprowadzenie Platforma.NET (.NET Framework) stanowi zintegrowane, niezależne od języka programowania środowisko programistyczne służące do wytwarzania i uruchamiania aplikacji lokalnych, internetowych oraz przeznaczonych na urządzenia mobilne Jej podstawowymi elementami składowymi jest środowisko uruchomieniowe CLR () oraz rozbudowana biblioteka klas BCL (Base Class Library) dostarczająca podstawowej funkcjonalności (m.in. operacje na plikach, wyświetlanie grafiki, interakcje z bazami danych, manipulacje dokumentami XML, komunikacja sieciowa, algorytmy kryptograficzne) Wprowadzenie Jednym z priorytetowych założeń w tworzeniu platformy.net było oparcie się na najnowszych standardach internetowych (m.in. XML, HTTP, SOAP, UDDI) oraz nacisk na rozwój usług sieciowych (głównie Web Services) Od swojej premiery w 2000 roku platforma.net jest uznawana za strategiczny kierunek rozwoju nowego oprogramowania w firmie Microsoft "Delivering an Internet-based platform of Next Generation Windows Services is the top priority of our company. The breakthroughs we re talking about here include changes to the programming model, to the user interface, to the application integration model, the file system, new XML schema..." Steve Ballmer Platforma.NET 2 Platforma.NET 3 Wprowadzenie Idea.NET sięga 1997 roku kiedy rozpoczęto prace nad unowocześnieniem technologii COM (Component Object Model) obejmującym przede wszystkim stworzenie lepszego systemu typów oraz usług dla przetwarzania rozproszonego Strategicznym celem prowadzonych prac rozwojowych było zaoferowanie logicznie spójnego i obiektowego środowiska dla różnorodnych aplikacji i usług W celu uniezależnienia się od języka programowania dążono do unifikacji różnych schematów zarządzania kodem, którego efektem końcowym było opracowanie infrastruktury wspólnego języka CLI Ewolucja nazwy projektu: COM3 COR COM+ 2.0 NGWS (Next Generation Windows/Web Services).NET Wprowadzenie Założenia i cele platformy.net: pełna interoperacyjność z istniejącym kodem (m.in. COM, kod natywny, Win32 API) pełna integracja językowa (obsługa wielu języków plus skrośne, międzyjęzykowe dziedziczenie, obsługa wyjątków i debugowanie) mechanizm wykonawczy wspólny dla wszystkich języków obsługiwanych przez platformę.net (język pośredni, dobrze zdefiniowany i zrozumiały dla wszystkich języków zbiór typów) bogata biblioteka klas podstawowych (duża funkcjonalność, uniezależnienie się od wywołań API, zgodny model obiektowy) minimalizacja konfliktów wersji heterogenicznych składników aplikacji (uproszczenie procesu dystrybucji i instalacji kodu) zarządzane środowisko wykonawcze (dowolny system operacyjny, uproszczona weryfikacja kodu pod względem bezpieczeństwa) uniezależnienie się od licencjonowania (i poprawienie) Javy Platforma.NET 4 Platforma.NET 5
Common Language Infrastructure Common Language Infrastructure U podstaw tworzonej platformy legła specyfikacja infrastruktury wspólnego języka CLI (Common Language Infrastructure) standardy ECMA-335, ISO/IEC 23271 Specyfikacja CLI definiuje: wspólny system typów CTS () zbiór zasad i wymagań definiujących podstawowe reguły współpracy języków programowania CLS (Common Language Specification) metadane (niezależne od języka programowania informacje pomocnicze dotyczące m.in. struktury programu) niezależne od platformy systemowej środowisko wykonywania kodu wirtualnego VES (Virtual Execution System) wspólny język pośredni CIL (Common Intermediate Language) generowany przez wszystkie kompilatory zgodne z CLI standardową bibliotekę klas BCL (Base Class Library) Obecnie ze specyfikacją CLI jest zgodne ponad 50 języków programowania, w tym m.in.: C# Managed C++ VB.NET J# Delphi.NET Fortran.NET JScript.NET Windows PowerShell IronPython IronRuby A#, L#, F#, P#,... Platforma.NET 6 Platforma.NET 7 Common Language Infrastructure Common Language Infrastructure Uproszczony model wykonawczy.net zdefiniowany w specyfikacji CLI źródło: Wikipedia Specyfikacja CLI definiuje dwa typy implementacji: Profil jądra (Kernel Profile) Profil kompaktowy (Compact Profile) Profil jądra zawiera typy i klasy niezbędne do pracy kompilatorów zgodnych ze standardem CLI (biblioteka klas bazowych BCL zawiera tylko podstawowe typy danych, klasy obsługujące operacje plikowe, implementujące jednowymiarowe tablice oraz atrybuty zabezpieczeń) Profil kompaktowy rozszerza funkcjonalność biblioteki BCL m. in. przez wprowadzenie dodatkowych bibliotek: XML zawierającą proste mechanizmy analizy składniowej XML Network obsługującą protokół HTTP i dostęp do portów Reflection obsługującą mechanizm refleksji Platforma.NET 8 Platforma.NET 9
Common Language Infrastructure.NET Framework Pojęcie platforma.net odnosi się do każdej implementacji specyfikacji CLI Przegląd platform.net:.net Framework Mono Portable.NET (DotGNU project).net Compact Framework.NET Micro Framework Microsoft XNA Microsoft Rotor SSCLI (Shared Source Common Language Infrastructure) Microsoft Silverlight Najbardziej znaną implementacją specyfikacji CLI jest Microsoft.NET Framework, na który składa się: środowisko uruchomieniowe CLR () biblioteka klas platformy FCL (Framework Class Library) CLR jest wirtualnym systemem wykonawczym odpowiedzialnym za zarządzanie typami danych.net, kompilowanie i uruchamianie kodu pośredniego MSIL (CIL), zarządzanie pamięcią, zapewnianie bezpieczeństwa typów FCL jest współdzieloną pomiędzy aplikacjami wykonywanymi w środowisku CLR biblioteką typów, na którą składają się klasy bazowe, klasy dostępu do danych, klasy obsługujące interfejs użytkownika oraz interakcje z kodem niezarządzalnym Platforma.NET 10 Platforma.NET 11.NET Framework.NET Framework Historia rozwoju.net Framework: 2002:.NET Framework 1.0 2003:.NET Framework 1.1 kontrolki mobilne ASP.NET, wsparcie dla ODBC i Oracle, obsługa IPv6 2005:.NET Framework 2.0 klasy częściowe, typy parametryzowane (generics), metody anonimowe, architektura 64-bitowa, hosting CLR przez SQL Server 2006:.NET Framework 3.0 Windows Presentation Foundation (WPF), Windows Communication Foundation (WCF), Windows Workflow Foundation (WF), Windows CardSpace 2007:.NET Framework 3.5 Language Integrated Query (LINQ), typy anonimowe, wyrażenia lambda, ASP.NET AJAX, wsparcie dla WMI i ActiveDirectory >2008:.NET Framework 4.0 Parallel LINQ (PLINQ), Task Parallel Library (TPL), Code Contract Struktura.NET Framework źródło: Wikipedia Platforma.NET 12 Platforma.NET 13
Wspólny system typów (CTS) definiuje bazowy zbiór typów dostępnych dla każdego języka zgodnego ze specyfikacją platformy.net oraz definiuje zbiór reguł i aksjomatów umożliwiających weryfikowalne bezpieczeństwo typologiczne Zunifikowany system typów: pozwala na kontrolowanie dostępu danych do pamięci, ich przetwarzanie i łączenie oferuje statyczne wykrywanie i eliminowanie niektórych klas błędów programistycznych wprowadza usystematyzowany sposób budowania i wielokrotnego użytkowania aplikacji ułatwia tworzenie kompilatorów poprzez zaoferowanie bezpiecznego, wirtualnego systemu wykonawczego (VES) umożliwia samoopisywanie się programów w postaci metadanych Hierarchia typów zdefiniowanych przez CTS obejmuje dwie podstawowe kategorie: typy wartościowe (value types) typy referencyjne (reference types) Podział na typy referencyjne oraz wartościowe jest związany zasadniczo ze sposobem składowania i porównywania instancji typów oraz uzyskiwania przez nie dostępu do pamięci, w której są przechowywane Pierwszą kategorię tworzą złożone typy wbudowane (m.in. tablice, łańcuchy znaków), interfejsy oraz typy definiowane przez użytkownika (klasy), drugą natomiast wbudowane typy proste, typy wyliczeniowe oraz typy definiowane przez użytkownika (struktury) Platforma.NET 14 Platforma.NET 15 Klasyfikacja typów: Object Class Interface Array String Delegate... typy referencyjne ValueType Struct Enum Byte Char Int16 Boolean Single Int32 Decimal Double Int64... typy wartościowe typy proste UInt16 UInt32 UInt64 Typy wartościowe wywodzą się ze specjalnej klasy ValueType (pośrednio z klasy Object) i służą do reprezentowania prostych wartości skalarnych (sekwencji bitów) Instancje typów wartościowych są alokowane na stosie wykonawczym (z wyjątkiem pól statycznych oraz pól klas), porównywane bit po bicie, a podczas odwołań są one bezpośrednio kopiowane Typy wartościowe narzucają mniejsze koszty pamięciowe i czasowe podczas pracy, o ile ich rozmiar nie jest zbyt duży Oznacza to, że struktury definiowane przez użytkownika powinny być relatywnie niewielkie (zwykle maksymalnie do 16 lub 64 bajtów) Platforma.NET 16 Platforma.NET 17
Podczas tworzenia instancje typów wartościowych są automatycznie zerowane, co skutkuje ustawieniem każdego pola na wartość domyślną (0 dla liczb całkowitych, 0.0 dla liczb zmiennoprzecinkowych, false dla wartości logicznych i null dla referencji) Typy wartościowe zdefiniowane przez użytkownika: są automatycznie pieczętowane (sealed) mogą mieć konstruktory z argumentami mogą dziedziczyć po wielu interfejsach mogą zawierać pola, metody, właściwości i zdarzenia Każdy typ wartościowy ma zdefiniowany i powiązany z nim typ referencyjny, nazywany tzw. opakowanym typem wartościowym CTS udostępnia mechanizm, który pozwala na zmianę domyślnego układu pól tworzonych struktur Atrybut StructLayoutAttribute pozwala na wskazanie jednego z trzech możliwych trybów działania: LayoutKind.Automatic tryb domyślny, w którym CLR samodzielnie uporządkowuje pola, co pozwala na optymalizację wyrównania pól LayoutKind.Sequential CLR uporządkowuje pola dokładnie tak, jak zostało to określone w kodzie IL LayoutKind.Explicit za pomocą atrybutu pola FieldOffsetAttribute programista może określać kolejność i rozmiar pól struktury Możliwość zmiany kolejności i przesunięcia pól w typach wartościowych ułatwia współpracę z kodem niezarządzanym, a także umożliwia precyzyjne określanie rozmiarów i położenia pól bitowych Platforma.NET 18 Platforma.NET 19 Przykład samodzielnego definiowania układu pól struktury: [StructLayout(LayoutKind.Explicit)] struct SampleUnion [FieldOffset(0)] string text; [FieldOffset(6)] short tag; [FieldOffset(4)] short data1; [FieldOffset(4)] byte data2; [FieldOffset(5)] byte data3; układ struktury w pamięci 0 1 2 3 4 5 6 7 Typy referencyjne (typy odwołań) wywodzą się bezpośrednio z klasy Object i są specyficznym połączeniem informacji o położeniu oraz wartości (zawartości) typu Instancje typów referencyjnych (obiekty) są alokowane i zarządzane na odśmiecanej stercie, odwołania do nich sprowadzają się do przekazania informacji o ich położeniu na stercie (wskaźnika), a porównanie obiektów ogranicza się do porównania ich położenia Utworzony na stercie obiekt żyje tak długo, dopóki istnieje osiągalna do niego referencja, po czym zajmowana przez niego pamięć jest zwalniana automatycznie w wyniku działania mechanizmu oczyszczania pamięci (Garbage Collection) Platforma.NET 20 Platforma.NET 21
Typy referencyjne zasadniczo można podzielić na: typy obiektowe typy interfejsowe typy wskaźnikowe Typy obiektowe (głównie klasy i tablice) opisują same siebie, implementując następujące metody: Equals() porównującą dwa obiekty GetHashCode() zwracającą wartość skrótu dla obiektu GetType() zwracającą typ obiektu ToString() zwracającą opis obiektu w postaci łańcucha znaków MemberwiseClone() zwracającą płytką kopię obiektu Finalize() wywoływaną przez GC przed odzyskaniem pamięci zajmowanej przez obiekt Typ interfejsowy stanowi zbiór publicznych, metod, właściwości oraz zdarzeń, które muszą zostać zaimplementowane przez typ wywodzący się z interfejsu Typ wskaźnikowy jest specyficznym, niezarządzalnym typem umożliwiającym swobodny dostęp do pamięci (do funkcji oraz danych), wykorzystywanym przede wszystkim do współpracy z kodem niezarządzanym Wartości typu wskaźnikowego nie są obiektami, nie można więc na ich podstawie określić typu wskazywanych wartości, ale można na nich wykonywać operacje arytmetyczne W środowisku zarządzanym ekwiwalentem wskaźnika do funkcji jest delegat, będący rygorystycznie kontrolowanym przez CLR typem obiektowym Platforma.NET 22 Platforma.NET 23 Porównanie rozmieszczenia oraz rozmiaru struktury i obiektu w pamięci: struct Point public int X; public int Y; int X (4B) int Y (4B) stos class Point public int X; public int Y; Syncblk (4B) TypeHandle (4B) int X (4B) int Y (4B) sterta Synblk Entry Table Method Table SyncBlock Zawsze wtedy, gdy środowisko uruchomieniowe oczekuje typu referencyjnego, a przekazywany jest typ wartościowy, wykonywana jest operacja pakowania (boxing), polegająca na przekształceniu typu wartościowego w typ referencyjny Środowisko uruchomieniowe udostępnia ponadto mechanizm odpakowywania (unboxing) tj. przekształcania typów referencyjnych w typy wartościowe Pakowanie i odpakowywanie wiążą się z alokowaniem pamięci oraz kopiowaniem danych pomiędzy stosem a stertą, i stąd są one operacjami kosztownymi czasowo Pakowanie i odpakowywanie są realizowane za pomocą odpowiednich poleceń języka IL, większość kompilatorów języków.net generuje odpowiedni kod automatycznie Platforma.NET 24 Platforma.NET 25
Przykłady pakowania/odpakowywania: int i = 1; object o = i; // boxing int j = (int) o; // unboxing // 3 x boxing Console.WriteLine(i +, + i +, + i); // no boxing (manual optimization) Console.WriteLine(o +, + o +, + o); ldc.i4.s 1 stloc.0 ldloc.0 box [mscorlib]system.int32 stloc.1 ldloc.1 unbox.any [mscorlib]system.int32 stloc.2 ArrayList list = new ArrayList(); int j; for (int i = 0; i < 10000; i++) list.add(i); // boxing for (int i =0; i < list.count; i++) j = list[i]; // unboxing Identyczność dwóch obiektów testowana przez statyczną metodę ReferenceEquals() jest określana za pomocą następujących reguł tożsamości: jeżeli typy obiektów są różne, to obiekty nie są identyczne jeżeli typy wartości są takie same i wartości są takie same, to obiekty są identyczne jeżeli obiekty są wskazaniami, a ich położenie i wartości są takie same, to obiekty są identyczne Równość dwóch obiektów testowana metodą Equals() jest określana za pomocą następujących reguł: jeżeli dwa obiekty są identyczne, to obiekty są sobie równe jeżeli przynajmniej jeden z obiektów jest spakowany, to przed wykonaniem operacji porównania opartego na regułach tożsamości musi zostać odpakowany Platforma.NET 26 Platforma.NET 27 Typ referencyjny może cechować się semantyką wartości tzn. może zachowywać się tak jak typ wartościowy (kopiowana i porównywana jest cała zawartość obiektu) Class c1 = new Class(); Class c2 = new Class(); object o1 = c1; Console.WriteLine(Object.ReferenceEquals(c1, c2); // false Console.WriteLine(c1.Equals(c2)); // true Console.WriteLine(Object.ReferenceEquals(c1, o1); // true Console.WriteLine(c1.Equals(o1)); // true String s1 = Ala ma kota ; String s2 = Ala ma kota ; Console.WriteLine(Object.ReferenceEquals(s1, s2); // true Console.WriteLine(s1.Equals(s2)); // true Referencja do obiektu może przyjmować specjalną wartość null oznaczającą, że taka referencja jest pusta BCL od wersji 2.0 udostępnia typ Nullable<T> zapewniający semantykę null dla typów wartościowych (T? w C#) struct Nullable<T> where T : struct public Nullable(T value); public bool HasValue get; public T Value get; Jeżeli właściwość HasValue zwraca false to instancja takiego typu reprezentuje semantyczną wartość null, w przeciwnym wypadku wartość instancji jest udostępniana przez pole Value Platforma.NET 28 Platforma.NET 29
Elementy składowe typu: pola (fields) metody (methods) właściwości (properties) typy zagnieżdżone (nested types) zdarzenia (events) atrybuty (attributes) CTS umożliwia ponadto definiowanie własnych atrybutów, których instancje mogą być dołączane do podzespołów, typów danych oraz ich składowych Atrybuty te stanowią część metadanych podzespołu i mogą być sprawdzane w trakcie wykonywania kodu poprzez mechanizm refleksji Przykład użycia własnych atrybutów: public class MyAttribute : Attribute public MyAttribute(string name)...... [MyAttribute( MyClass )] public class MyClass... [MyAttribute( MyClass::Test )] public void Test()... MyClass myclass = new MyClass(); Type type = myclass.gettype(); if (type.getcustomattributes( typeof(myattribute), false).length > 0) // do something MethodInfo minfo = type.getmethod( Test ); foreach (Attribute attr in minfo. GetCustomAttributes(false)) if (attr.gettype() == typeof(myattribute)) // do something Platforma.NET 30 Platforma.NET 31 Dostęp do elementów składowych typu jest uzależniony od trzech kryteriów: widoczności typu dostępności elementu składowego ograniczenia zabezpieczeń Pod względem widoczności (zakresu widoczności dla innych podzespołów) typy można przydzielić do trzech kategorii: typów eksportowanych możliwość eksportowania takich typów jest określana przez zasady dostępności zdefiniowane w konfiguracji podzespołu typów nieeksportowanych eksport takich typów jest zabroniony typów zagnieżdżonych (nested) typów będących elementem składowym innego typu (tzw. typu otaczającego), który to decyduje o zakresie widoczności Poziom dostępności składowych typu jest definiowany przez leksykalne reguły zasięgu danego języka programowania: dostęp publiczny public w C# dostęp prywatny private w C# dostęp rodzinny (chroniony) protected w C# dostęp podzespołowy internal w C# dostęp rodzinny lub podzespołowy protected internal w C# dostęp rodzinny i podzespołowy nieobsługiwany przez C# Dostęp do elementów składowych typu może być także kontrolowany za pomocą atrybutów zabezpieczeń, które pozwalają na definiowanie ograniczeń w postaci: żądań dziedziczenia żądań odwołania Platforma.NET 32 Platforma.NET 33
CLR jest wirtualnym systemem wykonawczym platformy.net odpowiedzialnym za całokształt wykonywania kodu zarządzanego (managed code) Do jego podstawowych zadań należy: ładowanie, kompilowanie i uruchamianie kodu pośredniego MSIL (Microsoft Intermediate Language), będącego implementacją języka CIL (Common Intermediate Language) zagwarantowanie bezpieczeństwa typów zapewnienie współpracy z kodem niezarządzanym zarządzanie pamięcią (zasobami) obsługa wyjątków obsługa mechanizmów kontroli bezpieczeństwa wykonywania aplikacji w oparciu o uprawnienia kodu CAS (Code Access Security) oraz role RBS (Role-Based Security) Kompilatory platformy.net przekształcają kod źródłowy z języków wysokiego poziomu do postaci wspólnego (niezależnego od CPU i systemu operacyjnego) kodu pośredniego MSIL, który w trakcie wykonywania aplikacji jest przekształcany dalej do postaci kodu macierzystego Ta dodatkowa warstwa abstrakcji pozwala na uzyskanie przenoszalności kodu, zwiększenie jego efektywności (optymalizacja na konkretną platformę) oraz umożliwia sprawdzenie bezpieczeństwa typów przed uruchomieniem MSIL jest językiem stosowym większość operandów, na których działają jego instrukcje znajduje się na tzw. logicznym stosie wykonawczym, który jest niezależny od zarządzanego przez system operacyjny stosu fizycznego Platforma.NET 34 Platforma.NET 35 Przykład operacji dodawania: Przykład programu Hello World : ldc.i4 5 ldc.i4 3 add Evaluation Stack 0000 0005 Evaluation Stack 0000 0003 0000 0005 Evaluation Stack 0000 0008 Evaluation Stack public static void main() Console.WriteLine( Hello World ); 20 00 00 00 05 20 00 00 00 03 58 ldc.i4 5 ldc.i4 3 add 1B 19 58.method static void main().entrypoint.maxstack 1 ldc.i4 5 ldc.i4 3 add ldc.i4.5 ldc.i4.3 add ldstr "Hello world" call void [mscorlib] System.Console::WriteLine(string) optymalizacja kodu ret Platforma.NET 36 Platforma.NET 37
Każdy zarządzany moduł (managed module) będący produktem kompilatora platformy.net jest złożony z: nagłówka PE (PE header) nagłówka CLR (CLR header) metadanych (metadata) kodu pośredniego (IL code) Nagłówek PE (Portable Executable) jest strukturą opisującą format obiektowych plików binarnych w systemie Windows (opartą o UNIX-owy format COFF) Nagłówek CLR zawiera podstawowe informacje związane z zarządzanym modułem, m.in.: żądaną wersję CLR, silną nazwę (strong name), lokalizację i rozmiary metadanych oraz bloku kodu pośredniego modułu Metadane zawierają szczegółowy opis wszystkich danych związanych z wygenerowanym kodem zarządzanym, m.in. definicje typów, ich zasięgi, informacje o dziedziczeniu, interfejsach, polach, metodach, własnościach, obsługiwanych zdarzeniach i atrybutach Podstawowym zadaniem metadanych jest umożliwienie środowisku wykonawczemu prawidłowego i efektywnego zarządzanie kodem, w tym: weryfikowanie bezpieczeństwa typów, śledzenia wykorzystania obiektów przez Garbage Collector, serializacji/deserializacji obiektów do/z postaci binarnej na maszynie zdalnej (remote machine) Innym przykładem wykorzystania metadanych jest funkcja IntelliSense dostępna w Visual Studio.NET Platforma.NET 38 Platforma.NET 39 Z logicznego punktu widzenia podstawową, wersjonowaną jednostką wdrożenia, wykonywania i wielokrotnego użytku w strukturze.net jest tzw. podzespół (assembly) Pojedynczy podzespół składa się z jednego lub więcej modułów zarządzanych oraz opcjonalnie z jednego lub więcej plików zasobowych Jeden z modułów wchodzących w skład podzespołu (tzw. moduł podstawowy) zawiera manifest, będący opisem zawartości (metadanymi) podzespołu Manifest specyfikuje nazwę podzespołu, numer wersji, referencje do podzespołów zewnętrznych, informacje na temat kultury, listę tabel metadanych z nazwami wszystkich plików w podzespole oraz token klucza publicznego Podzespół wyznacza tzw. granicę wersji (version boundary), umożliwiającą współdzielenie logicznych atrybutów podzespołu przez wiele plików fizycznych (rozdzielenie warstwy fizycznej i logicznej podzespołu) Wszystkie pliki składające się na podzespół są traktowane jako taka sama jednostka logiczna, której numer wersji jest zdefiniowany w manifeście podzespołu Podzespół wyznacza także granicę bezpieczeństwa (security boundary), od której zależą wszelkie uprawnienia dostępu Dostęp do typów i składowych typów w ramach podzespołu jest kontrolowany przez tzw. modyfikatory dostępu (access modifiers), np. public (dostęp nieograniczony), czy internal (dostęp ograniczony do tego samego podzespołu) Platforma.NET 40 Platforma.NET 41
W trakcie uruchamiania aplikacji wczytywane są tylko te podzespoły, bez których nie można przeprowadzić fazy inicjalizacji, pozostałe natomiast są wczytywane na żądanie wtedy, kiedy zajdzie taka konieczność Grupowanie często wykorzystywanego i wzajemnie powiązanego kodu daje programiście możliwość zoptymalizowania procesu wczytywania kodu W przypadku tworzenia aplikacji wielojęzycznych, zalecanym rozwiązaniem jest umieszczanie zasobów specyficznych dla danego języka, w dedykowanych do tego celu, specjalnych podzespołach tzw. satellite assemblies, definiując jednocześnie pozostałe podzespoły aplikacji jako kulturowo neutralne (culture-neutral) Podstawowym wymogiem dotyczącym równoczesnego współużytkowania wielu wersji tych samych podzespołów jest ich jednoznaczne identyfikowanie Atrybuty identyfikujące podzespół: nazwa podzespołu tzw. nazwa przyjazna (friendly name), będąca nazwą pliku podzespołu bez rozszerzenia wersja podzespołu numer wersji w formacie: <major version>.<minor version>.<build number>.<revision> kultura informacje o ustawieniach regionalnych (języku, kraju) token klucza publicznego symboliczna, 8-bajtowa reprezentacja klucza publicznego wykorzystanego w procesie podpisywania (signing) podzespołu W środowisku uruchomieniowym nazwa typu jest złożeniem nazwy nadanej przez programistę plus nazwy podzespołu Platforma.NET 42 Platforma.NET 43 Podzespoły mogą być wdrażane jako: prywatnie (privately deployed assemblies) instalowane najczęściej w katalogu bazowym aplikacji (AppBase) współdzielone (shared deployed assemblies) instalowane w globalnej pamięci podręcznej podzespołów GAC (Global Assembly Cache) i identyfikowane za pomocą silnej nazwy (strong name) Silna nazwa podzespołu tworzona w trakcie podpisywania podzespołu składa się ze wszystkich wcześniej wymienionych atrybutów identyfikujących podzespół oraz dodatkowo z podpisu cyfrowego Silna nazwa gwarantuje unikalność podzespołu w całym systemie oraz pozwala na weryfikację integralności podzespołu w trakcie jego ładowania Sposoby tworzenia kodu natywnego: Kompilacja JIT (Just-In-Time) stopniowo (tylko wywoływane fragmenty kodu) optymalizacja w kontekście aktualnego środowiska bezpieczeństwo typów weryfikacja bezpieczeństwa i uprawnień uruchamianego kodu Prekompilacja narzędziem NGEN (Native Image Generator) tworzy kod natywny przed pierwszym uruchomieniem nie są możliwe pewne optymalizacje, ale uruchomienie aplikacji jest szybsze (szczególnie jeśli przy starcie korzysta z wielu różnych klas) tak skompilowany kod może być tylko uruchomiony na docelowej platformie (dla której obraz został wygenerowany) Platforma.NET 44 Platforma.NET 45