410 likes | 543 Views
.NET CLR. Krizsán Zoltán Általános Informatikai Tanszék Miskolci Egyetem 1.0. Common Language Runtime. Közös nyelvi futtató rendszer A Microsoft üzleti implementációja Common Language Infrastruture (specifikáció), környezetek Létrehozó Fejlesztő futtató SSCLI (Rotor). Fő feladata.
E N D
.NET CLR Krizsán Zoltán Általános Informatikai Tanszék Miskolci Egyetem 1.0
Common Language Runtime • Közös nyelvi futtató rendszer • A Microsoft üzleti implementációja • Common Language Infrastruture (specifikáció), környezetek • Létrehozó • Fejlesztő • futtató • SSCLI (Rotor)
Fő feladata • Függetlenül hardvertől, szoftvertől: • Felügyelt futtatása a menedzselt kódnak • JIT fordítás • Biztonsági ellenőrzés
SegítségekÚj technológiák • Alkalmazás tartományok (Application Domain)processz – alprocesszlehetőségek ugyanazok, de azalprocessz (pl.: plugin): • logikai processz, • alacsony költségek • Szerelvények (assembly) dll, dekultúra, és több verzió
Virtuális futtató környezetek • 1960 alakult ki az elv • Lassú hardverek • kezdetleges rendszer • 1990-es évek Java Virtual Machine (JVM) • „Eléggé” gyors hardverek, • jól szervezett technológiák, • osztott rendszerek, • népszerű, • interpretált
Virtuális futtató környezetek II • 2000 .NET • Absztrakt futtató környezet • Nem interpretált • JIT fordítás • Telepítéskor fordítás (NGEN.exe) • Nyelv független • Osztott rendszerek
Menedzselt alkalmazás élete 1. Forráskód (20 nyelv valamelyike) 2. MSIL kód + metadata 3.a Telepítéskor NGEN.exe 3.b Közvetlen használat előtt JIT fordító 4. CLR betölti, futtatja az alkalmazást
JIT fordítás • Metódusonként fordít • Ha nem hívunk meg egy fv.-t, akkor nem is fordítja le • 32 byte-ig inline fv., felette fv. hívás
Egyszerű példa static void Main() { Console.WriteLine(”Hello”); Console.WriteLine(”Bello”); }
JIT fordítás menete • Mielőtt a Main lefutna a CLR az összes hivatkozást felderíti. • A felderített hivatkozásokból egy belső struktúrát épít fel. • Minden fv-hez egy bejegyzés. • Ez a bejegyzés tartalmazza majd a fv. kezdőcímét. • Végül beállítja a struktúra elemeit egy CLR-en belüli fv-re, nevezzük JITCopile-nak.
JIT fordítás menete II • Amikor a WriteLine fv. először meghívódika JITCompile hívódik meg helyette! • JITCompile átnézi a metadatákat a fv. IL kódját keresve. • JITCompile ellenőrzi, majd lefordítja az IL-t nativ-ra. • Dinamikusan lefoglal memóriát, majd rámásolja a lefordított nativ kódot.
JIT fordítás menete III • Visszatér, és átírja a struktúra megfelelő elemének tartalmát, hogy az a lefordított natív kódra mutasson. • 2. alkalommal csak fv hívás, mert már lefordította.
Köztes kódMIL, MSIL, CIL • 1-4 byte-os utasítások • kb 260 db utasítás • Objektum orientált (newobj, callvirt) • Assembly (load, push, pop, call) • Absztrakt • Stack alapú (box, unbox) • Kivétel kezelést használ • A CLR minden funkciója elérhető segítségével!
CLR menedzselt modul tartalma PE fej CLR fej METADATA IL kód Natív kód erőforrások
PE (portable executable) fej • Hasonlít a COFF-ra • Tartalmazza a fájl típusát: • GUI • CUI • DLL • Időpecsétet • Csak natív CPU kódot tartalmazó modul esetén plusz információk a kódról
CLR fej • Szükséges CLR verziószáma • Flegek • MetodDef metadata token a belépési ponthoz (Main fv.) • Helye, mérete, a modul: • METADATA-jának • erőforrásoknak • erős névnek • egyébb flegeknek • ...
Metadata • Minden menedzselt modul tartalmaz metadata táblákat • 2 fajtája van: • leírják a típusokat, tagokat, amelyeket ugyanezen forráskód tartalmaz. • leírják azokat a típusokat, tagokat, amelyekre ez a forráskód referál, hivatkozik. • A metadata csak a fájlban tárolódhat!
Assembly - szerelvény • Lehet exe vagy dll • Logikai, fizikai egysége az: • újrahasznosítható • telepíthető • verzionálható komponens. • Önleíró: minden információ tárol, ami szükséges a futásához. Semmilyen plusz info nem szükséges.
Szerelvény II • Több modult is tartalmazhat. • Önálló biztonsági egység • Önálló típus egység • Legkisebb verzionálható egység • Fej-fej melletti futást támogató egység • Kódban import • Referencia hatáskör
Több modul – egy szerelvényMikor szükséges, érdemes? • Típusokat tudjuk szétválasztaniÍgy a felhasználó lépésenként le tudja tölteni. • Erőforrásokat, adatokat mellékelünk a szerelvényhez. • Több programozási nyelven készül az alkalmazás.
Több modult tartalmazó szerelvény • Sajnos a VS.NET nem ismeri. (Kézzel kell) • A modulok PE-je nem tartalmaz manifest-et, ezeket a szerelvény tárolja! • A modult csc esetén /t[arget]:module paraméterrel kell fordítani!Az eredménye xxx.netmodule lesz. • Egy szerelvényhez hozzá kell adni a modul(oka)t a /addmodule: kapcsolóval,vagy AssemblyLinker al.exe-vel
Assembly Linker al.exe • Erőforrás hozzáillesztése a szerelvényhez: • beágyazás /embed[resource] • linkelés /link[resource] • 32 bites erőforrás hozzáillesztése/win32res • 32 bites ikon/win32icon
AssemblyInfo.cs • A VS.NET automatikusan létrehozza • Attribútumokat lehet benne definiálni, melyek a szerelvényre vonatkoznak. • Némelyiket lehet a al.exe-ből állítani • Pl.:[assembly:AssemblyVersion(”3.0.0.0”)]al.exe - /version paraméter
Assembly telepítése • Sima másolás • Privát telepítés, ha a szerelvény bárhová felmásoljuk, a használó másik szerelvény mellé., ilyenkor más szerelvények nem érik el. • Alkalmazás leszedése (uninstall) sima törlés • Nem kell regisztry-t, ini fájlokat módosítani
Szerelvények konfiguráció • XML fájlok • Futtatható szerelvény személyes konfigurációja, vele azonos jegyzékben: xxx.exe.config • ASP.NET Web Forms, XML Web szervízek esetén a virtuális gyökerében Web.config, lehet sajátja is mellette Web.config • HTML oldal link tag-je <LINK REL=”Configuration” HREF=url>
Globális konfiguráció • Felülírja az alkalmazás beállításait • Helye: %SystemRoot%\Microsoft.NET\Framework\vXXX\CONFIG\machine.config, ahol XXX a runtime verziója, pl.: 1.1.4322 • Grafikusan a Controll Panel alól.
.NET Framework • %windir%\system32 jegyzékben kell lennie egy MSCorEE.dll fájlnak. • Több verzió is fent lehet egyidejűleg. • Melyik a beállított?HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\policy
Menedzselt exe .text JMP _CorExeMain .idata DLL: MSCorLib.dll Function: _CorExeMain START Menedzselt exe betölti és inicializálja a CLR-t PE fej • Címtartomány Menedzselt exe CLR fej MSCorEE.dll
Folytatás • MSCorEE megvizsgálja CLR fejet, a Main metódus token lekérdezi. • Megvizsgálja Main metadata-ját, lekérdezi az IL helyét az EXE-ben. • Lefordítja IL kódot natív CPU kódra. • A Main fv. kezdő címére ugrik.
Program kérések Egy program, dinamikus, osztott • Hosztok futtatni szeretnének: • Távoli • Éppen letöltött, nem ellenőrzött, helyi • Helyi • Mobil kódot. • Szabad neki? (vírus, krekker, TU)
Megoldások • Egyszerű: engedélyezett a kód, vagy nem (egész kód) • Java: homokzsákba (sandbox) letölthetjük a távoli kódokat, de nincs interakció a helyi erőforrásokkal. • .NET típus biztos • Szerelvény ellenőrzése (manifest) • Típusok ellenőrzése a szerelvényben
Szerelvény ellenőrzés • A manifest integritásának ellenőrzésén alapul: • Tokenek hivatkozásának ellenőrzése (használt táblák) • Token sztring tábla hivatkozások ellenőrzése. • Ellenőrzés: • Amikor a GAC-ba betöltődik • Amikor a diszkről beolvassa a rendszer
Típus ellenőrzés • Ha az előző ellenőrzés sikeres volt, akkor következik • Óvatos • Nem menedzselt kód teljesen megbízott, nem ellenőrzi!
CIL kód kategóriák • IllegálisA JIT nem tudja natív kódra fordítani, érvénytelen utasítás(oka)t tartalmaz. Pl.: ugró utasítások rossz helyre • LegálisA JIT lefordítja nat. Kódra, de használ nem típus biztos lehetőségeket. Pl.: pointer aritmetikák adattagokra • Típus biztos • Ellenőrizhető
CTS CLR/CTS Visual basic C# CLS JAVA
CLS • CLS kompatibilitás az [assembly:CLSCompliant(true)]attribútummal kapcsolható be. public UInt32 ABC() {return 0;} public void abc(){}
CLS II • Az előző kód a CLS kompatibilitás bekapcsolása nélkül hibajelzés nélkül fut,de ha bekapcsoljuk, akkor: • hiba1 : előjel nélküli egész integer nem kompatibilis • hiba2 : a CLS nem case sensitive, így az ABC és az abc ugyanaz!
Profájlok • Könyvtárak (library) készlete. • Sztandard profájlok: • kernel – minimálisan ezt implementálni kell • típusokat implementáló osztályok • plusz osztályok a fordítóknak • compact – kiegészítő könyvtárakplusz funkciók
Sztenderd CLI struktúra E x t e n d e d N u m e r i c Lib Compact profile E x t e n d e d A r r a y Lib Kernel profájl Base Class Library Runtime Infrastructure Library XML Library Reflection Library Network Library
Irodalomjegyzék • http://msdn.microsoft.com/net