Assembly/DLL Reflexió

Slides:



Advertisements
Hasonló előadás
Haladó Programozás Reflexió OE-NIK HP.
Advertisements

Melyiket válasszam? Windows VS. Linux Készítette: Uher Bertalan.
Skultéti Attila március 24.
Számítógépes alapismeretek Kommunikáció Információs és Kommunikációs Technológiák (IKT)
A felhasználói interfész A felhasználói interfész az a felület, amellyel a szoftver az ember felé „fordul”; amellyel a felhasználó nap mint nap találkozik.
FIATALOK LENDÜLETBEN PROGRAM Ruska Mónika – Mobilitás Országos Ifjúsági Szolgálat - Fiatalok Lendületben Programiroda.
PÁTY ÖNKORMÁNYZATA POLGÁRMESTERI HIVATALÁNAK SZERVEZETFEJLESZTÉSE E-KÖZIGAZGATÁSI ALAPISMERETEK AZ ELEKTRONIKUS ÜGYINTÉZÉS ÉS HATÓSÁGI SZOLGÁLTATÁS Bemutató.
Devosa Iván Szegedi Tudományegyetem C#. A C# A C# (kiejtése: szí-shárp, esetenként cisz) a Microsoft által a.NET keretrendszer részeként kifejlesztett.
Bevezetés a C# nyelvbe Az alapok összefoglalása Farkas Csaba.
Nyitó szakértői találkozó. "C" komponens-informatika Készítette: Farkas László január.28.
CÉLCÉLCSOPORT  Egészségügyi szakmai tájékoztatás és betegtájékoztatás, az egészséges életvitelhez szükséges információk szolgáltatása, publikálása, áttekint-
Esettanulmány: egy inf. rendszer adatszerkezetének kialakítása ● Könyvtári adatbázis: ● Könyvek adatai: leltári szám, jelzet, szerző, cím, kiadás, ár,
Két nagy múltú szövegszerkesztő összehasonlítása az oktatás szempontjából.
Internet tudományos használata
Nemzeti Audiovizuális Archívum
Nagyméretű állományok küldése
Operációs rendszerek.
Valószínűségi kísérletek
Hogyan lehet sikeresen publikálni?
Adatbázis normalizálás
A közigazgatással foglalkozó tudományok
Alkalmazásfejlesztés gyakorlat
PHP - függvények.
Sz&p prof.
Az integrált áramkörök (IC-k) típusai és tervezése
LabVIEW bevezetéstől a feszültség-áram karakterisztikáig Vida Andrea
T.R. Adatbázis-kezelés - Alapfogalmak Adatbázis:
Programozás I. Gyakorlás egydimenziós tömbökkel Többdimenziós tömbök
Dependency Injection Moq Feladat
Tájékoztató a évi OSAP teljesüléséről
Visual Studio Code Metrics
Nyelvek típusossága.
Projektmunka Földrajzolok
Adatbázis-kezelés (PL/SQL)
Hernyák Zoltán Magasszintű Programozási Nyelvek I.
☺ Programozási környezetek Validátorok Fazekas Judit PTI 2010.
Hogyan lehet sikeresen publikálni?
Közigazgatási alapvizsga a Probono rendszerben
Körmendi Dániel MAS Meeting Scheduler.
Rendszerfejlesztés gyakorlat
Számítógépes Hálózatok
Az Endnote bibliográfia adatbázis-kezelő szoftver alapvető használata november Skultéti Attila
Informatikai gyakorlatok 11. évfolyam
AVL fák.
Web programozás és haladó fejlesztési technikák – C#
Informatikai gyakorlatok 11. évfolyam
B M Java Programozás 4. Gy: Java GUI IT A N Tipper, MVC kalkulátor
A villamos installáció problémái a tűzvédelem szempontjából
Új pályainformációs eszközök - filmek
Oracle Adatbázisok kezelése c#-ban
A csoportok tanulása, mint a szervezeti tanulás alapja
A Microsoft SharePoint testreszabása Online webhely
Tájékoztatás a évi Országos Statisztikai Adatfelvételi Program (OSAP) teljesüléséről az Országos Statisztikai Tanács és a Nemzeti Statisztikai Koordinációs.
A távoli asztal, valamint az Endnote használata a távoli asztalon
B M Java Programozás 9. Gy: Java alapok IT A N Adatkezelő 5.rész
Web programozás és haladó fejlesztési technikák
A számítógép története
Bibliográfia adatbázis-kezelő alkalmazások, EndNote 2018 Skultéti Attila
Szálszinkronizáció.
A szállítási probléma.
Foglalkoztatási és Szociális Hivatal
B M Java Programozás 2. Gy: Java alapok IT A N Adatszerkezetek
Matematika II. 5. előadás Geodézia szakmérnöki szak 2015/2016. tanév
SQL jogosultság-kezelés
IT hálózat biztonság Összeállította: Huszár István
Szöveges adatok tárolása
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Bevezetés Tematika Számonkérés Irodalom
Algoritmusok.
OpenBoard Kezelő Tananyag közzététele a KRÉTA rendszerben.
Előadás másolata:

Assembly/DLL Reflexió Haladó Programozás Assembly/DLL Reflexió OE-NIK HP

Assembly/DLL Reflexió Haladó Programozás Assembly/DLL Reflexió OE-NIK HP

Dynamic Link Library / Shared Object Program modul, ami tartalmazhat programkódot, megosztott erőforrásokat, melyek elérhetők más modulokból Külön fordított, a programhoz ténylegesen csak a futási időben kapcsolódik ( = dynamic) A memóriába csak egyszer töltődik be, több program is használhatja (= shared, .NET alatt ez korlátozottan igaz) A mai operációs rendszerek felhasználó számára elérhető programjai/moduljai kizárólagosan így működnek Windows OS alatt meg kell különböztetni a natív és a felügyelt DLL-t: Natív: OS/CPU számára értelmezhető bytekód: procedurális kód, egyszerű típusok, közvetlen HW elérés is akár Felügyelt: Egy (vagy több) .NET CLR osztály van benne, csak .NET műveletekkel „Korlátozottan igaz” = AppDomain –enként egyszer https://msdn.microsoft.com/en-us/library/vstudio/43wc4hhs%28v=vs.100%29.aspx OE-NIK HP

Dynamic linking Egyes függvények/erőforrások a program saját címterületén kívül vannak Ezek helye a fordítóprogram számára nem ismert Így fordításkor az ezekre történő hivatkozás dinamikus, futási időben derül ki a pontos hely (a betöltést az OS végzi) Ugyanazt a függvényt több program is együtt használja  megosztott erőforrás (~ Shared Object) A Legtöbb modern program így működik (Static Linking: ritka) Program 1 . @SomeFunct2 DLL SomeClass1 SomeFunct2 SomeFunct3 SomeClass2 Program 2 . @SomeFunct3 OE-NIK HP

.NET Assembly Assembly: a .NET világában semmi köze az assembly nyelvhez „a collection of types and resources that forms a logical unit of functionality” Assembly = „futtatási egység”, EXE vagy DLL file egyaránt lehet mindkettőben IL kód található Egy EXE file-ban van egy előre definiált entry point Közös tényezők: biztonság, típusok, hatókör/láthatóság, verziózás, telepítés A felügyelt DLL-ek közös tárban (GAC) regisztrálhatóak, ezáltal kezelhetőek a különféle verziók és függőségek (no DLL HELL) A C#/VB/C++/etc felügyelt forráskódból köztes kód fordítódik, ez garantáltan szintaktikai hibáktól mentes, így gyorsabban fordítható CPU/OS számára futtatható kóddá OE-NIK HP

.NET JIT JIT = Just-In-Time Metódusonként, az OOP elvek miatt a sebességvesztés kicsi NGEN.EXE használható, de sebességet nem mindig növel Hasonló elv, de sokban más: Java Hotspot VM OE-NIK HP

Assembly/DLL Reflexió Haladó Programozás Assembly/DLL Reflexió OE-NIK HP

Reflexió A reflexió az a képesség, amellyel a program önmaga struktúráját és viselkedését futásidőben analizálni és alakítani tudja Magas szintű nyelv kell hozzá (Java, PHP, … C#) Különböző mértékű támogatás a nyelvekben C#: System.Reflection névtér C#-ban a leggyakoribb használati módja a futásidőben végrehajtott típusanalízis De lehetséges típusok futásidejű létrehozása is: System.Reflection.Emit A típusok futásidejű vizsgálatát a fordító által a szerelvényben elhelyezett leíró információ (metaadat) teszi lehetővé Szerelvény = assembly: .exe, .dll (egyszerűsítés) Szerelvény metaadatai: függőségek, benne található típusok stb. Típus metaadatai: általa implementált interfészek, ősosztályok; tagjai stb. Tag metaadatai: láthatóság; metódusok paraméterei; tulajdonságokat alkotó metódusok stb. Hátránya: NAGYON LASSÚ!!! OE-NIK HP

Metaadat Visual Studio Command Prompt / Ildasm.exe, Ctrl+M OE-NIK HP

Reflexiót kihasználó eszközök és technológiák ILSpy, Reflector, … .NET dll-ek, exék kódjának tanulmányozását engedik meg Intellisense, Properties és más IDE-szolgáltatások Több .NET technológia (szerializáció, .NET Remoting, WCF) Tesztek OE-NIK HP

Futásidejű típusanalízis - Assembly Assembly a = Assembly.GetExecutingAssembly(); Assembly a = Assembly.LoadFrom(„Path.To.Assembly”); Assembly a = Assembly.Load(bytes); Assembly a = type.Assembly; a.GetTypes() – típusok kinyerése a.EntryPoint – belépési pont (metódus, exék esetén) OE-NIK HP

Futásidejű típusanalízis - Type Type t = assembly.GetType(„Type.Name.In.Assembly”); Type t = typeof(int); Type t = typeof(T); Type t = obj.GetType(); Type t = Type.GetType(„Type.Name.In.Any.Assembly”); Ha nem az aktuálisan végrehajtódó szerelvényben vagy az mscorlib.dll-ben van, akkor ún. „assembly-qualified name” megadása szükséges t.FullName, t.AssemblyQualifiedName – nevek különféle formában t.BaseType, t.IsSubclassOf(anotherType), t.IsAssignableFrom(anotherType) – ős, utód vizsgálat typeName can be the type name qualified by its namespace or an assembly-qualified name that includes an assembly name specification. See AssemblyQualifiedName. If typeName includes the namespace but not the assembly name, this method searches only the calling object's assembly and Mscorlib.dll, in that order. If typeName is fully qualified with the partial or complete assembly name, this method searches in the specified assembly. If the assembly has a strong name, a complete assembly name is required. TopNamespace.SubNameSpace.ContainingClass+NestedClass, MyAssembly, Version=1.3.0.0, Culture=neutral, PublicKeyToken=b17a5c561934e089

Futásidejű típusanalízis – MethodInfo, PropertyInfo, FieldInfo PropertyInfo pi = t.GetProperty("PropName"); PropertyInfo[] pis = t.GetProperties(); FieldInfo fi = t.GetField("FieldName"); FieldInfo[] fis = t.GetFields(); MethodInfo mi = t.GetMethod("MethodName"); MethodInfo mis = t.GetMethods(); Általában átadható BindingFlags paraméter, amivel a keresés szűkíthető/konfigurálható PropertyInfo pi = t.GetProperty("PropName", BindingFlags.Static | BindingFlags.NonPublic) Nem publikus (privát) tagok is megkaphatók Ez (elsősorban) nem arra való, hogy kijátsszuk a láthatóságokat! OE-NIK HP

Reflektált kódelemek használata futásidőben A reflexióval elért típusok példányosíthatók, a metódusok, tulajdonságok, mezők használatba vehetők futásidőben Type listType = typeof(List<int>); MethodInfo addMethod = listType.GetMethod("Add"); PropertyInfo countProperty = listType.GetProperty("Count"); object listInstance = Activator.CreateInstance(listType); object methodResult = addMethod.Invoke(listInstance, new object[] { 8 }); // null object propertyResult = countProperty.GetValue(listInstance); // 1 OE-NIK HP

Feladat Készítsünk olyan osztályt, amely automatikus szerkesztő GUI-t képes készíteni tetszőleges típusú példány számára A szerkesztő felületet a beadott példány tulajdonságainak vizsgálatával készítjük el OE-NIK HP

Attribútumok A fordító által generált metaadat mellé saját metaadat is felvehető Szerelvény, típus vagy tagok esetében is System.Attribute osztály utódai Léteznek beépített attribútumtípusok különféle célokra, vagy saját Attribute utód is létrehozható Használata speciális formában történik Névtér, osztály, metódus, tulajdonság, mező stb. fölött – attribútumtól függően – [XXX], ha az Attribute utódosztály neve XXXAttribute [Obsolete("Do not use this method, use New() instead.")] static void OldMethod() { } static void NewMethod() { } static void Main(string[] args) { OldMethod(); //Warningot eredményez } Példa src: http://www.codeproject.com/Articles/2933/Attributes-in-C OE-NIK HP

Tipikus használati esetek Másik programozó segítése: Obsolete, DisplayName, Description Visual Studio, debugger viselkedése: DebuggerDisplay, DebuggerStepThrough Visual Studio, automata generálás: WebMethod, ServiceContract, OperationContract, FaultContract, DataContract, DataMeber Kód használhatósága: Serializable, Flags, ThreadStatic, DllImport Automatizmusok támogatása: TestClass, TestMethod, Key, ForeignKey, Column Egyéb (saját) metaadatok: saját attribútumokkal Obsolete – elavult tag jelzése DisplayName – PropertyGrid vezérlőkben használt tipikusan Description – vajonmi DebuggerDisplay – ezt jeleníti meg debug közben DebuggerStepThrough – nem lehet belelépni F11 gombbal WebMethod – WCF REST kívülről hívható metódus; a többi WCF SOAP attribútum Serializable – vajonmi DllImport – DLL-ből való export használata Flags – Enumra rakható, használható a bitwise OR ThreadStatic – Szálanként statikus TestClass, TestMethod – Unit teszteknél ezekkel jelöljük h hol vannak a tesztek Key, ForeignKey, Column – EF code-first esetén ezzel jelölhetjük a későbbi táblák kulcsait, vagy esetleg az oszlop-leképezést OE-NIK HP

Attribútumok CallerMemberName Ha a paraméter nem kap értéket, akkor a hívó neve kerül bele protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } class Settings : Bindable { private string setting1; public string Setting1 get { return setting1; } set { setting1 = value; OnPropertyChanged(); } } OE-NIK HP

Attribútumok Szerializáció (=adat tárolható formába alakítása, a példában bináris) [Serializable] class Settings { public string Setting1 { get; set; } public int Setting2 { get; set; } [NonSerialized] private int temp; } class Program static void Main(string[] args) Settings settings = new Settings(); //... BinaryFormatter formatter = new BinaryFormatter(); using (FileStream stream = new FileStream("settings.dat", FileMode.Create)) formatter.Serialize(stream, settings); } //mentett információ visszaolvasása: FileMode.Open, Deserialize() A példában bináris, de van még csomó más féle. OE-NIK HP

Saját attribútum Saját attribútum létrehozása Attribútum elérése reflexióval Az eddig említett módszerek is ezt használják [AttributeUsage(AttributeTargets.Property)] class HelpAttribute : Attribute { public string HelpURL { get; private set; } public HelpAttribute( string helpURL) this.HelpURL = helpURL; } [Help("http://path.to.my.help.for.setting1.html")] public string Setting1 { get; set; } //PropertyInfo propertyInfo = typeof(Settings).GetProperty("Setting1"); HelpAttribute helpAttribute = propertyInfo.GetCustomAttribute<HelpAttribute>(); Console.WriteLine(helpAttribute.HelpURL); OE-NIK HP

Feladat Egészítsük ki az előzőleg létrehozott GUI-szerkesztőt a következő funkcionalitással: Lehessen tetszőleges „barátságos” nevet megadni a tulajdonságoknak – a tulajdonság eredeti neve helyett ez legyen kiírva Lehessen megtiltani, hogy a tulajdonság számára létrejöjjön szerkesztő OE-NIK HP