Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε

.NET Framework Παρουσίαση: Κακαλέτρης Γιώργος.

Παρόμοιες παρουσιάσεις


Παρουσίαση με θέμα: ".NET Framework Παρουσίαση: Κακαλέτρης Γιώργος."— Μεταγράφημα παρουσίασης:

1 .NET Framework Παρουσίαση: Κακαλέτρης Γιώργος

2 Εσωτερικά Χαρακτηριστικά
Θέματα Τι είναι το .NET Λειτουργία του .NET Εκτελέσιμα .NET OOP σε .NET Εσωτερικά Χαρακτηριστικά

3 Τι είναι το .NET Framework
Μεταγλωττιστές C++, C#, VB, J#, Perl, SmallTalk, Oberon … Περιβάλλον Εκτέλεσης Verifier Debuggers Class Libraries Loader JIT Compiler Profiler Λειτουργικό Σύστημα Εξωτερικές Υπηρεσίες / Εξυπηρετητές Υλικό

4 Που και πως «τρέχει» το .NET
MS .NET Framework Σαν πρόσθετο στοιχείο σε: Windows 98/98b/Me/NT4/2000 Υπάρχει ενσωματωμένο σε Windows XP/2003 MS .NET Framework SDK Windows NT4/2000/XP/2003 MS Shared Source CLI (Rotor) FreeBSD MONO Implementation Linux SS CLI Linux ports (Macadamian κλπ) Όλα τα στοιχεία του .NET δίνονται free από τη Microsoft για ανάπτυξη κάθε είδους εφαρμογής. Δεν ισχύει το ίδιο για το Visual Studio .NET το οποίο αποτελεί εμπορικό προϊόν.

5 Τι προσπαθεί να πετύχει το .NET
Βελτιωμένο απλοποιημένο προγραμματιστικό μοντέλο. Βελτίωση των διαδικασιών εγκατάστασης και συντήρησης. «Εξίσωση» γλωσσών προγραμματισμού. Ανεξαρτησία από πλατφόρμα υλικού. Βελτίωση χαρακτηριστικών ασφάλειας εκτελούμενου κώδικα. Απλοποιημένο προγραμματιστικό μοντέλο σε τομείς: Error handling (Παρά αυτών οι τωρινές βιβλιοθήκες κάποιες φορές ξεφεύγουν από τους σαφείς κανόνες χειρισμού σφαλμάτων και «τρώνε» εσωτερικά exceptions.) Results Returned (όμοια παρατήρηση με την παραπάνω) Single inheritance OO model (αναφέρεται μόνο σε managed κώδικα) Κατάργηση του COM ή DLL και ανάδειξη μόνο των .NET components. (υποστήριξη εγκιβωτισμού των COM/DLLs σε .NET components) Αύξηση της δυνατότητας επαναχρησιμοποίησης Αυτοματοποιημένη διαχείριση μνήμης (Garbage Collection) Βελτίωση των διαδικασιών debugging (cross language debuggers) Εκμετάλλευση της MSIL για αυτό. Στοιχεία AOP (attributes) Πρόσβαση σε όλα τα στοιχεία της υποκείμενης πλατφόρμας μέσω .NET components (ενδεχομένως ουτοπία) Βελτίωση της διαδικασίας εγκατάστασης και συντήρησης εφαρμογών και γενικά αποφυγή του DLL Hell Τοπικές εγκαταστάσεις (υπήρχε και πριν αντίστοιχη δυνατότητα από τα Win98b και έπειτα για τα COM components, τα οποία όμως επιπλέον ήθελαν το registry. Πάντα όμως ίσχυε για τα τυπικά DLLs ) Μηχανισμός παρακολούθησης version ενσωματωμένος στο .NET και δυνατότητα restore σε λειτουργούσα κατάσταση. Ιδιαίτερα Κατάργηση του Registry σαν μητρώο εγκατεστημένων συνιστωσών. H MS υποστηρίζει ότι με τον Windows Installer μπορούν να ξεπεραστούν όλα τα παραπάνω αλλά δυστυχώς είναι ιδιαίτερα δύσκολη η δημιουργία απόλυτα ορθών πακέτων εγκατάστασης με αποτέλεσμα σχεδόν πάντα να υπάρχουν προβλήματα. Ενοποίηση Γλωσσών Προγραμματισμού Τα πάντα μεταπίπτουν σε κοινή ενδιάμεση γλώσσα και μοντέλο τύπων οι οποίοι είναι ανεξάρτητοι γλώσσας Ανεξαρτησία από Πλατφόρμα Υλικού Καθώς το .NET framework κατά μεγάλο μέρος του δεν είναι «δεμένο» με τα windows ή τις υποκείμενες αρχιτεκτονικές, επιτρέπει να υπάρξουν ports αυτού σε άλλες πλατφόρμες. Επίσης άλλοι κατασκευαστές μπορούν να προσφέρουν δικά τους ports του .NET για Windows. Βελτίωση Χαρακτηριστικών Ασφαλείας Evidence based security (ο κώδικας αποδεικνύει την καταγωγή και προθέσεις του) Ασφάλεια τύπων κατά το runtime : έλεγχος κατά το πέρασμα τύπων και τιμών από το CLR. Σχεδόν καταργείται η ανάγκη ύπαρξης processes! Τρέχουν όλα σε ένα thread!

6 Τυποποίηση του .NET Οκτώβρης 2000 Microsoft + Intel + HP
Technical committee TC39 Technical Group 1 ECMAScript Technical Group 2 C# Technical Group 3 CLI Μορφοποίηση αρχείων (File Format) Ανοιχτό σύστημα μεταδεδομένων (Metadata System) Κοινό σύστημα τύπων (Common Type System) Ενδιάμεση γλώσσα (Intermediate Language) Πρόσβαση στην υποκείμενη πλατφόρμα (P/Invoke) Βασική βιβλιοθήκη κλάσεων για τυπικές και μικρές υπολογιστικές μονάδες Η JavaScript είναι η έκδοση της ECMAScript από την MS. CLI = Common Language Infrastructure, υποσύνολο της λειτουργικότητας του .NET Framework CLR Library MSCorLib.DLL: MS Common Object Runtime. Multilanguage Standard Common Object Runtime Library.

7 Γλώσσες Προγραμματισμού
Υπάρχουν σχεδόν όλες οι γνωστές γλώσσες: C++ (with Managed Extensions) , C#, VB.NET , J#, JavaScript , VBScript, Perl , COBOL, Component Pascal, Oberon, Python, RPG, Scheme, APL, Fortran, Eiffel, Haskell, Mercury, ML, Mondrian Διαφοροποιούνται ως: Συντακτικό Χαρακτηριστικά των CLR/CTS/ MSIL που εκθέτουν Ευκολίες εκμετάλλευσης δυνατοτήτων των CLR/CTS/MSIL Βασικοί τύποι Πρόσθετες βιβλιοθήκες κλάσεων κλπ Ομογενοποιούνται ως προς: Απλή κληρονομικότητα Χαρακτηριστικά επαναχρησιμοποίησης συνιστωσών Συμπεριφορά αντικειμένων C++ χωρίς multiple inheritance

8 Managed vs Unmanaged Code
Τυπικός κώδικας γλώσσας μηχανής (native code) Εκτός ελέγχου για το .NET runtime C++, VB6 κλπ Managed Code Τυπικός κώδικας ενδιάμεσης γλώσσας (IL) Υπό τον πλήρη έλεγχο του .NET runtime (CLR) C#, VB.NET, J# κλπ Διαλειτουργικότητα Managed σε Unmanaged : CLR Hosting. Unmanaged σε Managed : P/Invoke, COM Interoperability. Χάνονται τα πλεονεκτήματα του .NET όταν μεταπηδά κανείς σε unmanaged code

9 Common Language Runtime (CLR)
Το περιβάλλον εκτέλεσης εφαρμογών .NET. Βρίσκεται στο MSCorEE.DLL, MSCorWks/MSCorSvr.DLL Είναι το ανάλογο της JVM Είναι υπεύθυνο για: Διαχείριση εκτελέσιμου (Application hosting) Εντοπισμό και φόρτωση συνιστωσών / εφαρμογών Μεταγλώττιση IL σε CPU native code (JIT compilation) Επαλήθευση κώδικα (Verification) Χειρισμό διαδικασιών αποσφαλμάτωσης Ελέγχους ασφαλείας κώδικα Συνεργασία με CPU Native Code (P/Invoke) Χειρισμό exceptions MSCorEE = Microsoft Component Object Runtime Execution Engine.

10 Common Type System (CTS)
Περιγράφει ιδιότητες και συμπεριφορά των τύπων: Μέλη τύπων: Πεδία, μέθοδοι, ιδιότητες και γεγονότα. Κανόνες πρόσβασης μελών: ιδιωτική, προστατευμένη, δημόσια κλπ Κανόνες και συμπεριφορά κληρονομικότητας Διάρκεια ζωής αντικειμένων Εξισώνει σε ουσιαστικά θέματα τη συμπεριφορά των γλωσσών. Επιτρέπει τη στενή συνεργασία μεταξύ διαφορετικών γλωσσών.

11 Common Language Specification (CLS)
Ελάχιστο set δυνατοτήτων και χαρακτηριστικών του CLR/CTS και που πρέπει να υποστηρίζει ένας μεταγλωττιστής. Ένας τύπος που θα πρέπει να χρησιμοποιείται και από άλλες γλώσσες θα πρέπει να περιορίζεται ΜΟΝΟ στο CLS. Οι περιορισμοί αναφέρονται μόνο στα εξαγόμενα στοιχεία ενός assembly. Τυπικές γλώσσες VB: όλα τα εξαγόμενα είναι CLS compliant. C#: επιτρέπει μη CLS compliant features. C# VB J# CLS CTS/CLR MSIL Παράδειγμα μη CLS compliant χαρακτηριστικού: εξαγωγή τύπου (public) με πεδίο unsigned int32. Διάφοροι compilers (C#) μπορούν να εφαρμόζουν ελέγχους για τη συμβατότητα με CLS [assembly:CLSCompliant(true)]

12 MSIL Ενδιάμεση γλώσσα (~”OO Assembly”).
Stack Based (δεν υπάρχουν καταχωρητές). Εντολές χωρίς τύπους. IL κατά το ECMA Standard Είναι OO με την έννοια ότι υποστηρίζει ενγενώς overloading κλήσεων κλπ OO χαρακτηριστικά. Το ότι δεν υπάρχουν καταχωρητές κάνει πολύ εύκολη την εργασία των compiler vendors. Δεν υπάρχουν τύποι: πχ δεν υπάρχουν add64 και add32 άλλά απλά και μόνο add.

13 Framework Class Library (FCL)
Η βιβλιοθήκη συνιστωσών που συνοδεύει το .NET Framework. Ορίζει τύπους που εκμεταλλεύονται: .NET compilers .NET εφαρμογές. CLR. Επιτρέπει τη δημιουργία των παρακάτω τύπων εφαρμογών: XML Web Services Web Forms Windows Forms Console Applications Windows Services Component libraries Βασικότερο μέρος της κάτω από το System namespace. (MSCorLib.DLL)

14 Βασικές Βιβλιοθήκες FCL
System: Βασικοί τύποι. System.IO: Χειρισμός αρχείων και γενικά εισόδου/εξόδου System.Data: προσπέλαση βάσεων δεδομένων, OLEdb, ADO, ADO.NET κλπ System.Collections: Ευρετήρια, κατακερματισμένοι πίνακες, συλλογές, ουρές, σωροί κλπ System.Threading: Χειρισμός threads, ενδοεπικοινωνία κλπ System.Reflection: ενδοσκόπηση και δημιουργία κώδικα και εκτελέσιμων. System.Security: Χειρισμός κρυπτογραφίας, ελέγχων ασφαλείας, προσπέλασης σχετικών υπηρεσιών καταλόγου συστήματος κλπ System.Web.Services: Κλάσεις υποστήριξης δημιουργίας webservices. System.Web.Forms: Κλάσεις υποστήριξης δημιουργίας διαδικτυακών εφαρμογών. System.Windows.Forms: Κλάσεις υποστήριξης δημιουργίας τυπικών εφαρμογών Windows. System.Runtime.InteropServices: κλήσεις που επιτρέπουν την προσπέλαση σε COM objects, Win32 DLLs και Win32 API. System.XML: κλάσεις και κλήσεις χειρισμού XML δεδομένων. System.Text: χειρισμός κειμένου / κωδικοποιήσεων System.Runtime.Remoting: απομακρυσμένη χρήση τύπων System.Runtime.Serialization: μεταφορά τύπων από/σε streams. System.Globalization: NLS support, formatting, calendars κλπ System.Drawing: 2D Graphics για Windows Forms Applications κυρίως System.Diagnostics: debugging assistance. System.Management: WMI support. System.Resources: χειρισμός εξωτερικών αρχείων πόρων. System.NET: υποστήριξη λειτουργιών δικτύου. System.ServiceProcess: υποστήριξη λειτουργίας υπηρεσιών (windows services)

15 Assemblies - Executables
Managed Modules Παράγονται από τους μεταγλωττιστές Επικεφαλίδες (PE & CLR) Μεταδεδομένα (Metadata) Κώδικας ενδιάμεσης γλώσσας (IL Code) Assemblies Παράγονται από τους linkers/μεταγλωττιστές Πλήρως αυτοπεριγραφόμενες δομικές μονάδες Λογική μονάδα ομαδοποίησης εκτελέσιμων αρχείων (modules) και αρχείων πόρων (resource files) Ελάχιστη μονάδα επαναχρησιμοποίησης, ασφάλειας και διαχείρισης έκδοσης Αποτελούνται από 1 ή περισσότερα αρχεία Περιέχουν ειδικά μεταδεδομένα (manifest) Στατικά ή Δυναμικά Ισχυρά ή αδύναμα ονομασμένα. Μέσω Assemblies: Κατακερματισμός στοιχείων για μείωση χρόνου και χώρου μεταφόρτωσης. Προσθήκη μη αυστηρά δομημένων πόρων (text, image κλπ). Ενσωμάτωση τύπων πολλών γλωσσών προγραμματισμού σε ένα στοιχείο. Metadata χρήσεις των metadata: JIT enabling Serialization Garbage Collection Code Verification Reusability Enhancement Documentation Enhancement Λοιπά χαρακτηριστικά: Καταργούν τα IDL και type libraries Πάντα embedded σε modules. Ενδεικτικά μεταδεδομένα: Πίνακες ορισμού (definition tables): ModuleDef: Μία γραμμή που προσδιορίζει το module TypeDef: Μία γραμμή για κάθε τύπο που ορίζεται μέσα στο module. MethodDef, FieldDef,ParamDef,PropertyDef,EventDef : πίνακες που προσδιορίζουν τα χαρακτηριστικά μελών ενός τύπου. Πίνακες αναφορών (reference tables) AssemblyRef: Μία γραμμή για κάθε assembly το οποίο ενδέχεται να χρησιμοποιηθεί από αυτό το module. ModuleRef: Μία γραμμή για κάθε Module το οποίο περιέχει τύπους που ενδέχεται να χρησιμοποιηθούν από αυτό το module. TypeRef: Μία γραμμή για κάθε τύπο που χρησιμοποιοείται. Δείχνει σε ModuleRef ή ModuleDef entry, ανάλογα με την πυγή του τύπου. MemberRef: Μία γραμμή για κάθε μέλος τύπου που μπορεί να χρησιμοποιηθεί από αυτό το module. Πίνακες Manifest: AssemblyDef: Ο τυπικός header του assembly (version, hash, name κλπ) FileDef: Μία εγγραφή για κάθε αρχείο το οποίο αποτελεί μέρος αυτού του assembly (version, hash, name κλπ) ManifestResourceDef: Μία εγγραφή για κάθε πόρο που ορίζεται από αυτό το assembly (πόροι μπορεί να είναι και streams μέσα σε PE files) ExportedTypesDef: Μία εγγραφή για κάθε τύπο που εξάγεται από τα modules του assembly. Assemblies Περιέχουν αναφορές σε versions των assemblies και λοιπών στοιχείων στα οποία βασίζονται Δεν απαιτούν καμία πρόσθετη πληροφορία στο registry ή κάποια άλλη υπηρεσία καταλόγου (active directory) Κατακερματισμός Assemblies σε πολλαπλά module: Σε περίπτωση που δε βρίσκονται αρχεία που αποτελούν μέρος ενός assembly κατά τη φόρτωσή τους δίνεται FileNotFoundException. Σε περίπτωση που δεν κληθεί ποτέ μια μέθοδος που να καλεί τύπους που περιέχονται σε κάποιο module ενός assembly, αυτό δε θα μεταφερθεί ποτέ στο χώρο εκτέλεσης Δυναμικά assemblies Τα είναι PE formatted Δημιουργούνται στη μνήμη System.Reflection.Emit namespace.

16 Assembly Identification
Ονομασία Όνομα αρχείου Έκδοση Τέσσερα ψηφία Κουλτούρα EL EN-US κλπ Τιμή κατακερματισμού του δημοσίου κλειδιού του εκδότη.

17 Δημιουργία Assemblies
VB Source Code C# Source Code J# Source Code MS IL VB Compiler C# Complier J# Complier MSIL Assembler Resource File Managed Module Managed Module Resource File Managed Module Resource File Managed Module VB Compiler Manifest: περιγράφει τα υπόλοιπα αρχεία Συνήθως το assembly αποτελείται από ένα managed module το οποίο βρίσκεται στο ίδιο αρχείο. Αυτή αποτελεί την τυπική διαδικασία για compilers όπως VB και C# Resource file: HTML, XML, JPG, WAV κλπ Assembly Linker C# Complier J# Complier Assembly Manifest Resource File Managed Module Resource File Managed Module Resource File Managed Module

18 Domain Neutral Assemblies
AppDomain Χώρος εκτέλεσης μιας .NET Εφαρμογής. Τα AppDomains είναι διαχωρισμένα μεταξύ τους ως προς: Εκτέλεση Ασφάλεια Ρύθμιση λειτουργίας Σε κάθε Windows process που τρέχει CLR: Πολλά AppDomains (ένα default) Ένα χώρο ουδέτερων assemblies Μπορούν να αποφορτωθούν (Τα Assemblies όχι). Προσφέρουν μηνύματα κατάστασης προς hosted εφαρμογή. Ανταλλαγή αντικειμένων μεταξύ AppDomains (By value) μέσω serialization. Τα AppDomains προσφέρουν ασφάλεια ανάλογη των Processes λόγω του Verification. Στις κλήσεις μεθόδων μεταξύ AppDomains γίνεται thread transition. Windows Process CLR, GC Heap, Thread Pool AppDomain #1 (Default) AppDomain #2 Loader Heap Assembly App.EXE Loader Heap Assembly Plugin.DLL Type1 x86 Type1 x86 Assembly Types.DLL Assembly Types2.DLL Type2 x86 Type2 x86 Type3 x86 Assembly Sys.DLL Type3 x86 Assembly Sys.DLL Ρύθμιση λειτουργίας AppDomain: Όνομα Κατάλογος αναζήτησης Assemblies Θέση Configuration Files. Neutrality των assemblies (LoaderOptimization) Domain Neutral Assemblies Loader Heap Type1 x86 Assembly MSCorLib.DLL Type2 x86

19 Types Χαρακτηρισμός Μελών Πεδία: Περιέχουν: Μέθοδοι: Πρόσβαση:
Constants: πάντα ~static. Fields: readonly ή read/write, static ή instance. Instance constructors. Type constructors. Operator overloads. Conversion operators. Properties. Events: static ή instance. Types (nested types). Χαρακτηρίζονται: Normal Abstract Sealed Χαρακτηρισμός Μελών Πεδία: Static Read only Read write Μέθοδοι: Instance Virtual Shadows Override Abstruct Final Πρόσβαση: Private Family Family and Assembly Family or Assembly public Οι type constructors χρησιμοποιούνται για να αρχικοποιούν τα static πεδία. Στα static events ένας τύπος στέλνει μήνυμα σε τύπους που «ακούν» ενώ στα instance events τα συνδεόμενα μέλη είναι αντικείμενα. Ένα event απαιτεί συνήθως 2 μεθόδους (register / unregister) και ένα χώρο τήρησης των παρατηρητών (delegate). Δεν επιτρέπεται ατυχώς ο ορισμός αφηρημένων σφραγισμένων τύπων για τη δημιουργία βιβλιοθηκών συναρτήσεων (πχ math library) Τύπος: Φορέας συμπεριφοράς και κατάστασης. Πρέπει να έχει κανένα ή περισσότερα από τα παρακάτω Πεδίο (Field) Μέθοδος (Method) Χαρακτηριστικό (Property) Γεγονός (Event) Πρόσβαση: ένα από τα παρακάτω: Ιδιωτική (Private): all=private Συγγενική (Family): vb = protected Συλλογής και Συγγενική (Family and Assembly): not available in vb & c# Συλλογής (Family): vb=friend, c#=internal Συλλογής ή Συγγενική (Family or Assembly): vb=protected friend, c#=internal protected Δημόσια (public): all-public Το CTS καθορίζει ότι όλα τα αντικείμενα πρέπει να κληρονομούν από το System.Object type. Υπάρχουν πρόσθετες δηλώσεις που καθορίζουν πως θα γίνει χειρισμός ενός τύπου από το CLR (πχ ordering πεδίων, ANSI/Unicode strings για interoperability κλπ)

20 Primitive Types Τύπος που o compiler αναγνωρίζει και χειρίζεται διαφανώς ως προς: Μετατροπές Αναθέσεις Έλεγχο και Έκθεση σφαλμάτων Αντιστοιχεί σε τύπο του υποκείμενου FCL. VB: Command line parameters (πχ /removeintchecs+) που αλλάζουν τη συμπεριφορά του module όσον φορά στους ελέγχους πράξεων των μεταβλητών (integers) Ο System.Decimal ΔΕΝ είναι primitive.

21 Value Types Δεσμεύονται στο thread stack ή ενσωματώνονται στο χώρο ενός reference type. Δεν εμπίπτουν σε GC. Δεν ειδοποιούνται για την καταστροφή τους μέσω Finalize μεθόδου. Η χρήση τους δε γίνεται μέσω δείκτη αλλά με την ίδια την τιμή. Δεν απαιτείται επίλυση της αναφοράς για τη χρήση τους. Μια μεταβλητή που δείχνει σε ValueType έχει πάντα έγκυρη τιμή. Η ανάθεση μεταβλητής σε άλλη και γενικά η ανάθεση προκαλούν αντιγραφή. Δεν επιτρέπουν να δημιουργούνται τύποι κληρονόμοι (αυτόματα sealed). Δεν έχουν method tables. Δεν έχουν SyncBlockIndex entries. Κληρονομούν από το System.ValueType. Boxed και Unboxed μορφή Τυπικά valuetypes: Structures Enumerators Το CLR μπορεί να ανακατανείμει τα πεδία ενός τύπου στη μνήμη κατά τη δέσμευσή του, για λόγους βελτιστοποίησης. Αυτό μπορεί να το αποφύγει κάποιος μέσω του System.RunTime.InteropServices.StructLayoutAttribute. VB & C#: classes: LayoutKind.Auto structures: LayoutKind.Sequencial Το CLR δε δεσμεύεται για το «μηδενισμό» των πεδίων ενός Value Type

22 Reference Types Δεσμεύσεις από το διαχειριζόμενο σωρό.
Η δέσμευση αντικειμένου ενδέχεται να ξεκινήσει GC. Η στιγμιοτύπηση επιστρέφει το δείκτη σε αυτές. Μια μεταβλητή που αναφέρεται σε reference type μπορεί να είναι άκυρη Ο γενικός τρόπος μεταφοράς είναι με παράδοση του δείκτη. Κληρονομούν από το System.Object. Μεγάλο κόστος χρήσης. Πάντα boxed μορφή. To CLR δεσμεύεται για το μηδενισμό των πεδίων ενός Reference Type

23 System.Object Όλα τα αντικείμενα πρέπει να κληρονομούν από τον τύπο System.Object Επιτρέπει βασικές δυνατότητες στον τύπο: Σύγκριση δύο στιγμιότυπων για ισότητα Απόδοση αναγνωριστικού (hash) ανά στιγμιότυπο Αναγνώριση του πραγματικού τύπου ενός στιγμιότυπου «Ρηχή» αντιγραφή ενός στιγμιότυπου Απόδοση βασικής αναπαράστασης σε συμβολοσειρά, ενός στιγμιότυπου. Public Methods: Equals GetHashCode (πρέπει να γίνεται override από τύπους που θέλουν να το χρησιμοποιούν σαν κλειδί σε κάποιο hash και να δίνει καλή κατανομή τιμών) ToString (πρέπει να είναι culture sensitive) Default: Me.GetType().FullName.ToString() GetType (nonvirtual) Protected MemberwizeClone Finalize (nonvirtual)

24 Strings System.String Type StringBuilder Type.
Δε μεταβάλλεται μετά τη δημιουργία (Immutable). Συνήθως δε δημιουργούνται μέσω newobj αλλά μέσω ldstr από τα metadata (Interning). Όμοιες στιγμιοτυπήσεις δείχνουν σε ίδια δεδομένα (string pooling) StringBuilder Type. Δεν είναι immutable και επιτρέπει το χειρισμό strings. Πλέον αποδοτικό. Εσωτερικά δείχνει σε πίνακα χαρακτήρων.

25 Namespaces Imports / Using κλπ για τους compilers.
Δηλώνονται ρητά (π.χ. Namespace statement) Ομαδοποίηση θεματικά συναφών συνιστωσών. Άγνωστα για το CLR (μόνο πλήρεις ονομασίες) Ένα assembly μπορεί να περιέχει πολλά namespaces. Πολλά assemblies μπορούν να γεμίζουν το ίδιο namespace. Το όνομα ενός namespace είναι ανεξάρτητο του ονόματος ενός assembly.

26 Events / Delegates Events Delegates Βασίζονται στη χρήση delegates.
Βήματα: Ορισμός τύπου για πέρασμα παραμέτρων (arguments). Ορισμός ενός delegate που καθορίζει το πρότυπο συνάρτησης ειδοποίησης και θα αποθηκεύει τους ενδιαφερόμενους για ειδοποίηση. Δημιουργία μεθόδων εγγραφής και διαγραφής ενδιαφερομένων. Δημιουργία μεθόδου εξαπόλυσης του μηνύματος (virtual protected συνήθως με ονοματολογία OnEventName) Υλοποίηση λειτουργικότητας εξαπόλυσης του μηνύματος. Delegates «Δείκτες σε συναρτήσεις». Επιτρέπουν ανάρτηση λειτουργικότητας κατά την εκτέλεση. Type safe. Multicast ή Single-cast Οι τύποι που περνούν σαν παράμετροι γενικά κληρονομούν από την System.EventArgs. Τα delegates κληρονομούν από τα System.MulticastDelegate και System.Delegate. Οι compilers αποκρύπτουν τη δημιουργία της παραπάνω nested κλάσης από το developer. Chaining λέγεται η λειτουργικότητα της αλυσιδωτής ενημέρωσης των ενδιαφερομένων. Οι μεταγλωττιστές συνήθως απλοποιούν τη διαδικασία: δημιουργίας του delegate δημιουργίας των add/remove μεθόδων παράδοσης ενός μηνύματος

27 Object Lifetime Δημιουργία Καταστροφή Τελεστής New
Δέσμευση από το διαχειριζόμενο χώρο μνήμης (managed heap) για τα την κατάστασης του αντικειμένου. Δέσμευση χώρου εσωτερικών δομών για το χειρισμό του αντικειμένου: Δείκτης σε πίνακα μεθόδων Δείκτης σε SyncBlockIndex Κλήση του constructor. Δεν υπάρχει destructor (GC) Καταστροφή Αυτόματη (GC) Γίνεται κάποια στιγμή μεταξύ της απαλοιφής της τελευταίας αναφοράς στο αντικείμενο και του τερματισμού του AppDomain: Απαλοιφή αναφορών Καλείται από το σύστημα η Finalize μέθοδός του, ώστε το αντικείμενο να απελευθερώσει πόρους. Απελευθερώνεται η μνήμη. Dispose pattern: βοηθά στην αιτιοκρατική απελευθέρωση πόρων. Newobj η εντολή της MSIL που δημιουργεί ένα αντικείμενο. Η MSIL δεν καλεί αυτόματα τους base constructors, όμως μερικές γλώσσες μπορούν να το κάνουν. Οι type constructors καλούνται με δύο τρόπους: είτε αυστηρά πριν τη χρήση ενός τύπου είτε χαλαρά μέχρι αυτή. Έχουν στόχο την προετοιμασία των static πεδίων του τύπου.

28 JIT Compiler Μεταγλώττιση κατά την είσοδο σε μέθοδο.
Επίλυση assembly dependencies κατά την είσοδο σε μέθοδο (αναφορές τύπων) Διευκολύνεται από την MSIL και τα Metadata. Μειονεκτήματα Αυξημένη καθυστέρηση κατά την 1η εκτέλεση μεθόδου Αυξημένες απαιτήσεις μνήμης Πλεονεκτήματα Βελτιστοποίηση για CPU, μνήμη, OS, κατάσταση συστήματος. Δυνατότητα παρακολούθησης συμπεριφοράς και βελτιστοποίηση Pre-JITing Μεταγλώττιση άπαξ κατά την εγκατάσταση. Η βελτιστοποίηση για την τρέχουσα κατάσταση μπορεί να αναφέρεται σε τεχνικά χαρακτηριστικά του μηχανήματος (CPU, μνήμη κλπ) τα οποία μάλιστα μπορεί να αλλάζουν μεταξύ διαδοχικών εκτελέσεων. Η δυνατότητα παρακολούθησης συμπεριφοράς (profiling) θεωρητικά μπορεί να οδηγήσει σε recompiling ώστε για παράδειγμα να επιτευχθεί καλύτερο branch prediction κλπ. Pre-JITing: μέσω του ngen.exe

29 Εκτέλεση Διαχειριζόμενου κώδικα
Φόρτωση εκτελέσιμης συνιστώσας (exe/dll). Αν το σύστημα δεν έχει γνώση του .NET: Μεταπήδηση μέσω stub (native code) σε σημείο που εισάγεται από το CLR DLL. Αρχικοποιείται το CLR. Εντοπίζεται το διαχειριζόμενο σημείο εισόδου (managed code entry point). Αν το σύστημα έχει γνώση του .NET ο παραπάνω stub κώδικας αγνοείται. Εφόσον το επόμενο σημείο μεταπήδησης (εδώ είναι η entry method) δεν έχει μεταγλωττιστεί σε native CPU code: Διαβάζονται όλοι οι αναφερόμενοι τύποι της «περιοχής». Δημιουργείται πίνακας μεταπήδησης για κάθε νέο αναφερόμενο τύπο και μέθοδό του. Αρχικοποιείται ο πίνακας σε προκαθορισμένο σημείο εντός του CLR. Γίνεται μεταπήδηση στο σημείο εκτέλεσης. Γίνεται μεταγλώττιση της MSIL σε native κώδικα (JIT Compiler). Αντικαθίσταται η εγγραφή του πίνακα σημείων μεταπήδησης ώστε να δείχνει σε native κώδικα. Γίνεται μεταπήδηση στο native κώδικα. Χρησιμοποιούνται οι τυπικές OS loader / LoadLibrary κλήσεις για τη φόρτωση της .NET συνιστώσας/εκτελέσιμου. Η _CorExeMain/_CorDllMain είναι το σημείο μεταπήδησης στο MSCorEE.DLL. MSCorEE = Microsoft Component Object Runtime Execution Engine. Ο πίνακας μεταπήδησης μεθόδων αρχικοποιείται σε τιμή η οποία προκαλεί ουσιαστικά την κλήση του JIT Compiler. Μετά την πρώτη εκτέλεση μιας μεθόδου ο πίνακας αλλάζει και δείχνει πλέον σε native code με αποτέλεσμα να μην υπάρχει καμία πρόσθετη καθυστέρηση σε επόμενες κλήσεις. Οι native εντολές προφανώς αποθηκεύονται σε δυναμικά δεσμευμένο μέρος μνήμης.

30 Garbage Collector Αφορά στο διαχειριζόμενο σωρό και όχι το stack.
Λειτουργία: Τυπικά εκτελείται όταν γεμίσει μέρος της διαχειριζόμενη μνήμης (γενεά 0) κληθεί η System.GC.Collect() Δημιουργούνται ρίζες «Roots»: Global variables Static variables Stack parameters CPU registers που δείχνουν σε reference Types. Αντικείμενα λίστας FReachable Αρχικά όλα τα άλλα θεωρούνται σκουπίδια. Δημιουργείται γράφος αναφορών ξεκινώντας από κάθε ρίζα. Αν βρεθούν σημαντικά αχρησιμοποίητα τμήματα μνήμης: Καλούνται οι Finalize των αντικειμένων που δε χρησιμοποιούνται. Γίνεται μεταφορά για συμπίεση (memcopy) των αντικειμένων που χρησιμοποιούνται. Αναπροσαρμόζονται όλοι οι δείκτες. Άλλα χαρακτηριστικά: Γενεές αντικειμένων: Finalization List: λίστα αντικειμένων που απαιτούν Finalization FReachable List: αντικείμενα που δε χρησιμοποιούνται και απαιτούν Finalization. Υλοποίηση Dispose Pattern για απελευθέρωση πόρων (IDisposable Interface). Ανάσταση αντικειμένων (resurrection) Short & Long Weak references (System.WeakReference Type). Σε πολυεπεξεργαστικό σύστημα: ένα thread GC CPU. thread που χτίζει το γράφο αντικειμένων σε idle time. Sync-Free allocations: η μνήμη χωρίζεται σε πολλές Arenas με αποτέλεσμα η προσπέλαση στο σωρό να μην απαιτεί συγχρονισμό των threads. Large Objects (>85KB): Πάντα γενεά 2. Κλήση της Finalize γίνεται και χωρίς να εκτελείται ο GC όταν είτε το AppDomain είτε το CLR κλείνουν. Δε γνωρίζει κανείς σε ποιο thread εκτελείται το Finalization. (Τυπικά υπάρχει ειδικό high priority thread). Προβλήματα της Finalize: Δεν είναι αιτιοκρατική η σειρά που θα κληθούν οι Finalize. Ενδεχομένως υπάρχουν αναφορές σε κατεστραμμένα αντικείμενα! Δημιουργεί καθυστέρηση γιατί κατά την απελευθέρωση καθώς καλούνται οι Finalize Δεν εξασφαλίζει τη γρήγορη απελευθέρωση πόρων Τα Finalizable objects προωθούνται σε παλιότερες γενεές του GC με αποτέλεσμα να αυξάνουν την πίεση μνήμης Τα Finalizable objects μένουν περισσότερο σε ζωή με αποτέλεσμα να συντηρούν σε ζωή και τα αναφερόμενα σε αυτά αντικείμενα. Τα Finalizable objects καθυστερούν περισσότερο να δημιουργηθούν καθώς απαιτούν είσοδο στη Finalizable list. FReachable List: περιέχει αντικείμενα των οποίων επίκειται η κλήση της Finalize. Γενεές: Υποστηρίζονται 2 γενεές με default μεγέθη 256KB, 2MB και 10MB. Τα μεγέθη των γενεών αναπροσαρμόζονται αυτόματα από το GC ώστε να παρακολουθούν τη συμπεριφορά της εφαρμογής. Ο JIT βάζει flag σε όσα παλιά objects έχουν αλλαγές πεδίων reference μετά το προηγούμενο GC. Μετά το resurrection ενδεχομένως γίνεται επαναεγγραφή για Finalization Το resurrection χρησιμοποιείται για object pooling κυρίως.

31 Exceptions Ενιαίος μηχανισμός αναφοράς και χειρισμού σφαλμάτων
Try/Catch blocks Try Catch (conditional-unconditional) Finally Throw Πηγή Exceptions Εφαρμογής και συνιστωσών (πχ FCL) Περιβάλλοντος / Χώρου εκτέλεσης / Συστήματος Συμβατότητα με CLS: Exceptions που κληρονομούν από System.Exception. Εφαρμογή πολιτικών για το χειρισμό unhandled exceptions: Μέσω κώδικα. Μέσω Registry και πολιτικών διαχείρισης. Προβληματισμοί: Exceptions ή Return Values : Τι είναι σφάλμα; Μη απόκρυψη exceptions. Το FCL αποκλίνει από την ορθή υλοποίηση του μηχανισμού! Λάθη FCL: Πολλές exception classes δεν επιτρέπουν πέρασμα InnerException σε constructor. Αποκρύπτει exceptions! (πχ DataGrid) Ορισμός χειριστή unhandled exceptions μέσω AppDomain.CurrentDomain.UnhandledException. Εκεί μπορεί να αποσαφηνιστεί το αν η εφαρμογή κλείνει κλπ. Επίσης επιτρέπεται μέσω Registry να ρυθμιστεί η λειτουργία του JIT κατά HKLM\Software\Microsoft\.NETFramework\DbgJITDebutLaunchSetting : αν εξαπολύεται debugger, αν εκτελούνται οι AppDomain handlers κλπ

32 Verification Εκτελείται από το CLR όταν μεταφράζει IL σε CPU Instructions Ελέγχει ότι τα μεταδεδομένα είναι ορθά δομημένα. Βεβαιώνεται ότι κάθε οδηγία είναι «ασφαλής»: Δε διαβάζεται μνήμη που δεν έχει προηγουμένως γραφεί. Κάθε κλήση μεθόδου έχει σωστό αριθμό παραμέτρων. Κάθε παράμετρος μεθόδου είναι του ορθού τύπου. Κάθε μέθοδος έχει μία κλήση επιστροφής (return). Κάθε μέθοδος έχει μία επιστρεφόμενη τιμή. Κλπ Υπάρχει δυνατότητα απενεργοποίησης από Administrator. Σε περίπτωση αστοχίας verification δημιουργείται System.Security.VerifierException και η μέθοδος ΔΕΝ εκτελείται Υπάρχει εργαλείο PEVerify το οποίο ελέγχει τον κώδικα της IL αν είναι verifiable. Ουσιαστικά δοκιμάζει το αποτέλεσμα ενός compiler. Για τη διαδικασία verification απαιτείται πρόσβαση στα metadata του κώδικα.

33 Εγκατάσταση Εκτελέσιμα αρχεία Συνιστώσες:
Απλή αντιγραφή τους στο σύστημα – στόχο (exe) Μοναδική ανάγκη προετοιμασίας η δημιουργία shortcut. Πιο σύνθετες διαδικασίες για «ειδικές εφαρμογές» (π.χ. Services κλπ) Συνιστώσες: Privately Deployed Assemblies Τοπικά διατιθέμενες συνιστώσες. Προτεινόμενη λύση για το φαινόμενο DLL Hell. Καμία ανάγκη «registration»: εγκατάσταση με απλή αντιγραφή των assemblies στο χώρο εκτέλεσης της εφαρμογής. Η εφαρμογή τρέχει πάντα με τις συνιστώσες τις οποίες είχε αναπτυχθεί και δοκιμαστεί. XML Configuration scripts μπορούν να αλλάξουν το χώρο και τρόπο αναζήτησης συνιστωσών μιας εφαρμογής. Globally Deployed Assemblies Ολικά διατιθέμενες συνιστώσες. Απαιτούν «registration» XML Configuration scripts καθορίζουν τη συμβατότητα μεταξύ τους. Διατίθενται μηχανισμοί αντιμετώπισης του φαινομένου DLL Hell. Probing for assemblies: διαδικασία με την οποία το CLR ψάχνει για ένα assembly. (Δεν υπάρχουν absolute path names) Έστω αναζήτηση του language neutral mytypes.dll: AppDir\mytypes.dll AppDir\mytypes\mytypes.dll AppDir\path1\mytypes.dll AppDir\path1\mytypes\mytypes.dll AppDir\path2\mytypes.dll AppDir\path2\mytypes\mytypes.dll Έστω αναζήτηση του EL mytypes.dll: AppDir\EL\mytypes.dll AppDir\EL\mytypes\mytypes.dll AppDir\EL\path1\mytypes.dll AppDir\EL\path1\mytypes\mytypes.dll AppDir\EL\path2\mytypes.dll AppDir\EL\path2\mytypes\mytypes.dll Τα path1 και path2 ορίζονται στα configuration files. Οι καταλήξεις EXE και DLL δεν υπάρχουν στα metadata αλλά προστίθενται αυτόματα από το CLR.

34 Strong & Weak Assemblies
Ίδιο format PE Weakly Named Assemblies: Μόνο private deployment Αναγνώριση από το filename. Strongly Named Assemblies Private deployment Global deployment Αναγνώριση από 4 στοιχεία: Name Version Culture Public key token (PK hash) Δημιουργούνται από τον compiler / AL με παροχή του ζεύγους Public / Private Key. Εξασφαλίζεται το αναλλοίωτο των περιεχομένων τους. Δεν εξασφαλίζεται η πηγή τους. Side-by-Side execution. Διαδικασία υπογραφής assemblies από τον compiler: Παρέχεται το ζεύγος public/private key Αναζητούνται τα αρχεία που απαρτίζουν το assembly Τα περιεχόμενα κάθε αρχείου κατακερματίζονται με SHA-1 (με δυνατότητα υπέρβασης με χρήση του /algid για τον AL.EXE ή του System.Reflection.AssemblyAlgorithmAttribute) και το hash μπαίνει στο FileDef metadata table. Τα περιεχόμενα του όλου PE κατακερματίζονται με SHA-1. Το αποτύπωμα υπογράφεται με το ιδιωτικό κλειδί. Η δημιουργούμενη ψηφιακή υπογραφή τοποθετείται σε ειδική θέση του PE η οποία δεν έχει ενσωματωθεί στην ψηφιακή υπογραφή. Ο CLR header ενημερώνεται για τη θέση αυτή. Ενσωματώνεται το public key στο manifest του assembly (AssembyDef πίνακας) Τα κλειδιά μπορούν να παρέχονται από αρχεία ή CSPs (διαφορετικά attributes) Delayed signing: Τα assemblies δημιουργούνται χωρίς τη χρήση του ιδιωτικού κλειδιού. Το δημόσιο είναι αρκετό για να μπορεί να αναφερθεί από άλλα assemblies. Τα αρχεία ιδιωτικού/δημοσίου κλειδικού δημιουργούνται χωριστά ή αποχωρίζονται (SN utility). Γίνεται μέσω attributes και linking switches. Για να είναι δυνατή η εγκατάσταση στο GAC δηλώνεται στο assembly ότι δεν απαιτείται tampering verification. Γιατί PK hash και όχι PK: Το public key μπορεί να είναι εκατοντάδες bytes, κάτι το οποίο θα έκανε τεράστιο ένα πίνακα μεταδεδομένων που αναφέρεται σε αρχεία από τα οποία εξαρτάται η εφαρμογή. Ασφάλεια: Για την εξασφάλιση της πηγής : Microsoft Authenticode Technology

35 Side-by-Side Execution
Application.EXE Neutral V PK MYSTRINGS.DLL Neutral V PK BLL.DLL Neutral V PK Επιτρέπει να μην απαιτείται η προς τα πίσω συμβατότητα σε νέες συνιστώσες Χαρακτηριστικό-κλειδί για την επίλυση του DLL Hell. MYSTRINGS.DLL Neutral V PK

36 Global Assembly Cache (GAC)
Default θέση: C:\Windows\Assembly\GAC\ Δυνατότητα υπέρβασης για δημιουργία κοινόχρηστου GAC. HKLM\Software\Microsoft\Fusion\CacheLocation string Ατεκμηρίωτη δομή. Εγκατάσταση με GAVUtil.exe, Installer και ShFusion.dll. Γραφική περιήγηση με ShFusion.dll shell extension. Τα assemblies ελέγχονται για τροποποίηση μία φορά κατά την εγκατάστασή τους. Υπάρχει δυνατότητα μερικής δημοσιοποίησης ενός assembly μέσω του codebase URL. Το GAC κατεβάζει αρχεία σε download cache του οποίου το Quota ρυθμίζεται στο ελάχιστο συστήματος/χρήστη (registry keys)

37 Global Assembly Cache (GAC)
Directory of C:\WINDOWS\assembly\GAC 24/11/ :44 πμ <DIR> . 24/11/ :44 πμ <DIR> .. 11/07/ :25 πμ <DIR> Accessibility 30/09/ :17 πμ <DIR> ADODB 24/11/ :44 πμ <DIR> CrystalDecisions.ReportSource 24/11/ :44 πμ <DIR> CrystalDecisions.Windows.Forms 24/11/ :44 πμ <DIR> CrystalReportPluginLib 13/07/ :31 πμ <DIR> IEHost 11/07/ :25 πμ <DIR> IIEHost 11/07/ :25 πμ <DIR> ISymWrapper 30/09/ :17 πμ <DIR> Microsoft.CF.WindowsCE.Forms 13/07/ :31 πμ <DIR> Microsoft.JScript 24/11/ :44 πμ <DIR> Microsoft.VisualBasic.Compatibility.Data 11/07/ :25 πμ <DIR> Microsoft.VisualBasic.Vsa 11/07/ :22 πμ <DIR> MSDATASRC 11/07/ :22 πμ <DIR> Office 13/07/ :31 πμ <DIR> Regcode 24/11/ :44 πμ <DIR> SoapSudsCode 11/07/ :22 πμ <DIR> stdole 13/07/ :31 πμ <DIR> System 30/09/ :17 πμ <DIR> System.CF.Design 30/09/ :17 πμ <DIR> System.CF.Drawing 30/09/ :17 πμ <DIR> System.CF.Package

38 Διαχείριση Εφαρμογών Αρχεία διαχείρισης / ρυθμίσεων
Σύνταξη XML Καθορίζουν: Δέντρο αναζήτησης στοιχείων Συμβατότητα εκδόσεων συνιστωσών Συμβατότητα με CLR Τοπικά Configuration Files (.config) Αρχεία στο χώρο της εφαρμογής (xxxx.config) Ειδική κατηγορία: Publisher Policy αρχεία (συνιστώσας). Ολικά Configuration Files Ένα ανά έκδοση του CLR (Machine.config) Διαχείριση .config αρχείων με: MMC UI (“.NET Configuration” administrative tool) Text editor (π.χ. Notepad) System.Configuration namespace Το publisherpolicy key έχει και subkey “apply” με το οποίο ενεργοποιείται/απενεργοποιείται η χρήση του publisher policy file για κάποιο assembly μιας εφαρμογής.

39 Επιδιόρθωση Εφαρμογών
Αρχείο καταγραφής αναφορών στιγμιοτύπου εφαρμογής. Τηρείται από το CLR αυτόματα και ημερομηνιακά. Δημιουργείται μία εγγραφή κάθε φορά που αλλάζει κάποιο αναφερόμενο assembly. “Fix An Application” Εργαλείο επαναφοράς προηγούμενης κατάστασης για Windows NT/2000/XP/2003. Μέσω των Wizards του .NET Framework για Win 98/Me. Δημιουργεί application config file που χειρίζεται τις ανακατευθύνσεις.

40 .NET Configuration MMC SnapIn

41 Παράδειγμα .config file
Αρχείο προσδιορισμού θέσης: <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" /> <codeBase version=" " href=" </dependentAssembly> </assemblyBinding> </runtime> </configuration> Παράδειγμα δήλωσης διαδρομής αναζήτησης assembly: <probing privatePath="bin;bin2\subbin;bin3"/> <bindingRedirect oldVersion=" " newVersion=" "/> <assemblyIdentity name="mySecondAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" /> <publisherPolicy apply="no"> Υπάρχουν στοιχεία των config files που μπορούν να μπαίνουν μόνο σε machine.config ή publisher policy files (px codebase element) Assembly versions can be redirected in application, publisher policy, or machine configuration files. Publisher policy can be set only in the application configuration file. Παράδειγμα χρήσης .config file από κώδικα (όπως τυπικά ini αρχεία) <configuration> <appSettings> <!-- User application and configured property settings go here.--> <!-- Connection string values --> <add key="Provider" value="MSDAORA" /> <add key="DataSource" value="DBTest" /> <add key="UserID" value="Lavanya" /> <add key="Password" value="Password" /> <add key="MailServer" value="EXCH.XYZ.COM"/> </appSettings> </configuration> VB.NET Dim colNameVal As System.Collections.Specialized.NameValueCollection colNameVal = System.Configuration.ConfigurationSettings.AppSettings Dim str As String For Each str In colNameVal.AllKeys Debug.WriteLine(colNameVal.Get(str)) Next End Sub C#. NET System.Collections.Specialized.NameValueCollection colNameVal; colNameVal = System.Configuration.ConfigurationSettings.AppSettings; foreach(string str in colNameVal.AllKeys) { Debug.WriteLine(colNameVal.Get(str)); }

42 AOP και .NET Attributes: Custom Attributes: Ψευδο-attributes:
Χαρακτηρισμοί στοιχείων. Αλλάζουν τη συμπεριφορά των compilers, του CLR ή ακόμα και του εκτελέσιμου κώδικα. Custom Attributes: Δημιουργούνται από τον προγραμματιστή. Μοιάζουν με στιγμιότυπα που έχουν αποθηκευτεί (“serialized”) στα metadata και επανέρχονται για χρήση κατά τη στιγμή εκτέλεσης. Κληρονομούν από το System.Attribute Class Εφαρμόζονται σε επιλεγμένα στοιχεία. Μπορεί να εφαρμόζονται μία ή περισσότερες φορές. Μπορούν να αρχικοποιούνται μέσω constructor ή να δίνονται τιμές πεδίων μέσω ειδικής σύνταξης. Ελέγχονται κατά το χρόνο εκτέλεσης και μεταβάλλουν τη συμπεριφορά του εκτελέσιμου. Ψευδο-attributes: Συχνά χρησιμοποιούμενα ειδικά attributes Γνωστά Compiler level attributes: System.SerializableAttribute System.FlagsAttribute System.AttributeUsageAttribute Σε VB εφαρμόζονται ως εξής: <Assembly:MyAttribute(1)> ή <Module:MyAttribute(2)> ή <MyAttribute(3)>(αναφέρεται στο επόμενο στοιχείο) Τα custom attributes περιορίζουν το πεδίο εφαρμογής τους μέσω του System.AttributeUsageAttribute Ο constructor ενός custom attribute μπορεί να χρησιμοποιεί μόνο πολύ βασικούς τύπους (Boolean, UIntXX, IntXX,Type, String, Object, Single, Double, Car, Byte, Sbyte) και μονοδιάστατους πίνακες αυτών. Φυσικά αρχικοποιούνται μόνο με compile time constants. Η ανάθεσή τους σε ένα τύπο ελέγχεται με την System.Type.IsDefined. Η ανάθεσή τους σε assemblies, modules, methods κλπ ελέγχεται με τις static IsDefined,GetCustomAttributes και GetCustomAttributes της System.Attribute. Μπορούν να ελέγξουν ακόμα και για κληρονομούμενα attributes. Η IsDefined δε στιγμιοτυπεί το Attribute και είναι ταχύτατη. Οι άλλες προσπελαύνουν τα μεταδεδομένα και στιγμιοτυπούν το attribute (ενδεχομένως με χρήση νέου constructor). Η Match του Attribute πρεπει να γίνεται override αν θέλει κανείς συνεπή έλεγχο της ισότητας δύο attributes. Ψευδο-attributes Γίνονται για λόγους όγκου και απόδοσης Τα αναγνωρίζει το CLR Αποθηκεύονται στα metadata σαν bit flags του τύπου. Πχ System.NonSerializedAttribute System.SerializedAttribute System.InteropServices.OutAttribute System.InteropServices.InAttribute System. InteropServices.DllImportAttribute

43 Εργαλεία .NET Framework
VBC.EXE: VB Complier CL.EXE: C++ Complier CS.EXE: C# Complier ILDASM.EXE: IL Disassembler ILASM.EXE: IL Assembler AL.EXE: Assembly Linker MSCorEE.dll: CLR Gacutil.exe: Εγκαθιστά strong assemblies σε GAC SN.exe: Δημιουργεί το ζεύγος private/public key. NGEN.exe: Μεταγλωττίζει ένα IL module σε native κώδικα και υπερβαίνει το “JITing”. ngen.exe

44 Περισσότερες Πληροφορίες / Αναφορές
Links: ECMA ( MS.NET ( MONO ( Αναφορές: Applied Microsoft .NET Framework Programming (vb/c#) Jeffrey Richter, WinTellect, Microsoft Press 2002. Microsoft Developers Network 2003. .NET Framework Essentials, Tbuan Thai & Hoang Lam, O’Reily.

45 ΠΡΟΣΘΕΤΕΣ ΔΙΑΦΑΝΕΙΕΣ

46 VB.NET vs C# VB.NET C# Πάντα CLS Compliant τύποι. Υπό συνθήκη catch
Case insensitive / Case preserving Δεν υποστηρίζει υπερφόρτωση τελεστών. Προσφέρει μηχανισμό standard modules. Προαιρετικό weak casting. Δεν υποστηρίζει interface constructors. Optional παράμετροι μεθόδων. Πολλές ιδιότητες με παραμέτρους ανά τύπο. C# Επιτρέπει μη CLS compliant τύπους (UInt32). Υποστηρίζει υπερφόρτωση τελεστών. Υποστηρίζει υπερφόρτωση μετατροπέων (=). Τελεστής «as» για τη μετατροπή τύπων. Checked/unchecked μεταβλητές. Indexer-default property : Μόνο μία ιδιότητα με παραμέτρους ανά τύπο (Item []) Δυνατότητα unsafe arrays (skip index checking). Το attribute Microsoft.VisualBasic.CompilerServices.StandardModuleAttribute επιτρέπει να μη χρειάζονται fully qualified ονόματα για τα μέλη ενός module. Type Casting μέσω του DirectCast και Ctype Ctype: ιδιαίτερα «επιθετικό», χρησιμοποιεί διαφανώς τις υπηρεσίες του compiler. (Microsoft.VisualBasic.CompilerServices) Ο τελεστής as της C# ελέγχει και μετατρέπει τύπους αποφεύγοντας διπλό έλεγχο. Στη VB πρέπει να γίνει έλεγχος κατά το TypeOf και μετά επίσης κατά το Cast αν θέλει κάποιος να αποφύγει το exception.

47 C++ Η μόνη γλώσσα πλέον που παράγει CPU native code στην πλατφόρμα VS.NET Με χρήση switch παράγει MSIL αντί x86 κώδικα. /clr switch. Ο παραγόμενος κώδικας τρέχει εντός CLR: Καταναλώνει τύπους και συνιστώσες .NET. Εξυπηρετείται από μέρος της λειτουργικότητας του CLR. Καταναλώνει τυπικές συνιστώσες x86 (DLLs κλπ). Δε μεταγλωττίζει: inline assembly (__asm) μεταβλητό αριθμό παραμέτρων Διάφορες χαμηλού επιπέδου δυνατότητες (π.χ. Κλήσεις setjmp, __enable κλπ) Ότι δε μεταγλωττίζει σε MSIL το μεταγλωττίζει σε εντολές x86. Τα δεδομένα δεν είναι διαχειριζόμενα Δε στιγμιοτυπούνται στο διαχειριζόμενο χώρο (managed heap). Δε συλλέγονται με τυπικές διαδικασίες (garbage collection). Δεν έχουν μεταδεδομένα. Τα ονόματα των μεθόδων αλλοιώνονται. Δεν επιτρέπει πολλαπλή κληρονομικότητα.

48 Boxing / Unboxing Boxing: Unboxing:
Μετατροπή ενός Value Type σε Reference Type. Δεσμεύεται μνήμη στο διαχειριζόμενο σωρό. Αντιγράφονται τα περιεχόμενα του Value Type. Χρησιμοποιείται ο δείκτης στο αντικείμενο που δημιουργήθηκε. Η διαδικασία μπορεί να γίνει όταν απαιτείται δείκτης σε αντικείμενο πχ VT σε μέθοδο με παράμετρο τύπου System.Object. Αποφευκτέα διαδικασία: εισάγει κόστος. Unboxing: Η διαδικασία απόκτησης της τιμής ενός Reference Type. Η συνοδεία του unboxing από αντιγραφή της τιμής στο stack την κάνει αντίστροφη διαδικασία του boxing. Η MSIL δεν εισάγει διαδικασία boxing. Οι C# και VB εκτελούν τη διαδικασία αυτόματα. H C++ προσφέρει τελεστές. InvalidCast exception αν υπάρχει null pointer.

49 Publisher Policy Μεταφέρει την «σύσταση» του δημιουργού ενός assembly για τη χρήση μιας συγκεκριμένης έκδοσης. Πρόκειται για ειδικά ονομασμένο assembly: Policy.v_major.v_minor.assembly_name.dll Συνοδεύεται από ειδικά ονομασμένο configuration file: assembly_name.config Πρέπει να εγκατασταθεί στο GAC. Θα αναζητηθεί σαν policy αν ισχύει το apply publisherproperty. Πάντα θα χρησιμοποιηθούν τα machine policies. Συνίσταται η χρήση του μόνο για διόρθωση bugs. Το publisherpolicy key έχει και subkey “apply” με το οποίο ενεργοποιείται/απενεργοποιείται η χρήση του publisher policy file για κάποιο assembly μιας εφαρμογής. <publisherPolicy apply=“no”/> BindingRedirect είναι το κλειδί το οποίο διατάσσει το CLR να φορτώσει κάποια έκδοση έναντι κάποιας άλλης. Μέσω του machine.config ένας διαχειριστής μπορεί να ανακατευθύνει ολικά τις αιτήσεις κάποιου assembly. Publisher policy αρχεία μπορούν να δημιουργηθούν με τον AL.EXE: AL.EXE /out:policy.1.0.mydll.dll /version:

50 Distributed Garbage Collector
Απαιτείται για το .NET Remoting Βασίζεται σε άδειες που λήγουν και πρέπει να ανανεώνονται (Leases) Server AppDomain: Leasemanager Client AppDomain: Sponsor (registered client) Ανανέωση άδειας: Έγκριση ανανέωσης κατά την ερώτηση του LeaseManager. Κλήση στο remote object Κλήση της Renew() της Lease κλάσης.

51 .NET Remoting Example using System; using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class CoHello : MarshalByRefObject { public static void Main( ) TcpChannel channel = new TcpChannel(4000); ChannelServices.RegisterChannel(channel); RemotingConfiguration.RegisterWellKnownServiceType ( typeof(CoHello), // Type name "HelloDotNet", // URI WellKnownObjectMode.Singleton // SingleCall or Singleton ); System.Console.WriteLine("Hit <enter> to exit..."); System.Console.ReadLine( ); } public void SayHello( ) Console.WriteLine("Hello, Universe of .NET"); using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; public class Client { public static void Main( ) try TcpChannel channel = new TcpChannel( ); ChannelServices.RegisterChannel(channel); CoHello h = (CoHello) Activator.GetObject( typeof(CoHello), // Remote type "tcp:// :4000/HelloDotNet" // Location ); h.SayHello( ); } catch(Exception e) Console.WriteLine(e.ToString( ));

52 Πίνακες (Arrays) Κληρονομούν πάντα από το System.Array τύπο.
Επιτρέπεται μετατροπή τύπων Πίνακες ίδιων διαστάσεων Δυνατή η μετατροπή κάθε μέλους. Σαν παράμετροι περνούν πάντα με αναφορά (by reference). Επιτρέπονται πολυδιάστατες και μη μηδενικής βάσης Χαμηλότερη απόδοση Μονοδιάστατες, με μηδενική βάση (διανύσματα): Εγγενής υποστήριξη από την IL. Jagged Arrays: Πίνακες πινάκων Μη CLS Compliant

53 Interfaces Interface Inheritance vs Implementation inheritance.
Δεν κληρονομούν από το System.Object. Μπορούν να ορίζουν: Events Methods Properties Μπορούν να ορίζουν static εκδόσεις των παραπάνων (μη συμβατά με CLS) Δεν επιτρέπεται να ορίζουν Instance fields Instance Constructors Επιτρέπεται Private ορισμός ώστε να αποκρύπτονται από τη διεπαφή του τύπου υλοποίησης. Πολλαπλός ορισμός συνώνυμων συναρτήσεων από πολλά υλοποιούμενα interfaces και επιλεκτικά: διαφοροποίηση των υλοποιήσεων του καθενός ενοποίηση υλοποίησης σε μία μέθοδο. Προσοχή: Αναφορά σε Interface ValueType προκαλεί boxing

54 Διάφορα Το FCL/CLR προϋποθέτουν τα αντικείμενα να υλοποιούν συγκεκριμένη λειτουργικότητα ώστε να αποδίδουν τα αναμενόμενα. Πχ: IConvertible και γενικά casts. Equals/GetHashCode Formating IFormatProvider, ICustomFormatter κλπ Object Cloning: Swallow και Deep Copy. Swallow copy: MemberWiseClone() Reflection Μεγάλη σημασία για: Δημιουργία ανοικτών συστημάτων μέσω χρήσης pluggable components. Βελτίωση ευκαιριών επαναχρησιμοποίησης κώδικα (προσαρμογή με ενδοσκόπηση)

55 Ασφάλεια σε εφαρμογές .NET
Code Access Security Code Verification Assembly Signing


Κατέβασμα ppt ".NET Framework Παρουσίαση: Κακαλέτρης Γιώργος."

Παρόμοιες παρουσιάσεις


Διαφημίσεις Google