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

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Τεχνολογίες Web Απαραίτητες γνώσεις για την υλοποίηση της άσκησης.
Advertisements

Ερωτηματολόγιο Συλλογής Απαιτήσεων Εφαρμογών Υψηλών Επιδόσεων
Κληρονομικότητα. Εισαγωγή  Κληρονομικότητα (Inheritance) καλείται ο μηχανισμός με τον οποίο μία νέα κλάση που ονομάζεται παράγωγη (derived class) δημιουργείται.
ΕΙΣΑΓΩΓΗ ΣΤΗΝ PHP. Τι θα μάθουμε;  Να καταλάβουμε τι είναι η PHP και πώς δουλεύουν τα PHP scripts  Τι χρειάζεται για να ξεκινήσουμε με την PHP  Να.
7.3.8 Μεταφραστές Ελληνογαλλική Σχολή Καλαμαρί - Τίκβα Χριστίνα.
ΙΩΑΝΝΗΣ ΚΩΝΣΤΑΝΤΙΝΟΥ 1ο ΦΡΟΝΤΙΣΤΗΡΙΟ ΠΑΡΑΣΚΕΥΗ 5 ΟΚΤΩΒΡΙΟΥ 2012 ΑΙΘΟΥΣΑ Β4 11.
-Στοίβα-Ουρά - Πλεονεκτήματα πινάκων -Δομές δεδομένων δευτερεύουσας μνήμης -Πληροφορική και δεδομένα -Παραδείγματα-Προβλήματα ψευδοκώδικα.
Διαδικασία ανάπτυξης Προσδιορισμός απαιτήσεων Αρχιτεκτονικός Σχεδιασμός Λεπτομερής Σχεδιασμός Κωδικοποίηση Έλεγχος Παράδοση Συστήματος Λειτουργία - Συντήρηση.
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΤΜΗΜΑΤΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ
Εισαγωγή στους Η/Υ Πίνακες.
ΣΤΟΙΧΕΙΑ ΨΕΥΔΟΚΩΔΙΚΑ ΒΑΣΙΚΕΣ ΔΟΜΕΣ ΒΑΣΙΚΟΙ ΑΛΓΟΡΙΘΜΟΙ ΠΙΝΑΚΩΝ
Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού
ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αναφορές Αντικείμενα ως ορίσματα.
ΘΕΩΡΙΑ ΔΙΑΛΕΞΗ 4 Αριθμητικές εκφράσεις και πράξεις Εντολές ανάθεσης
Εκτέλεση Αλγορίθμων σε ψευδογλώσσα
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Εισαγωγή στον Προγραμματισμό, Αντώνιος Συμβώνης, ΣΕΜΦΕ, ΕΜΠ, Slide 1 Εβδομάδα 3: Υλοποίηση μεθόδων.
ΜΑΘ-3122/106 Προγραμματισμός
ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Φροντιστήρια Εισηγητής: Σπύρος Αργυρόπουλος Μέλος ΕΤΕΠ Εργαστήριο Προγραμματισμού & Τεχνολογίας Ευφυών Συστημάτων.
Προγραμματισμός PASCAL Πληροφορική Γ' Λυκείου μέρος γ
Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής Αντώνιος Συμβώνης, ΕΜΠ, Slide 1 Week 6: Java Collections Εβδομάδα 6: Συλλογές δεδομένων στην Java.
Resource Description Framework
Σελίδα 1 ΕΚΠΑ. «Διαμόρφωση υπηρεσίας καταλόγου Active Directory σε Windows 2003» Τηλέμαχος Ράπτης Εθνικό και Καποδιστριακό.
Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής Αντώνιος Συμβώνης, ΕΜΠ, Slide 1 Week 4: Exceptions Εβδομάδα 4: Εξαιρέσεις [Exceptions]
Torque Game Engine - #02 Κώστας Καρπούζης (kkarpou)
Εισαγωγή στον Προγραμματισμό (στη γλώσσα Java)
Αντικείμενα, Κλάσεις και Μέθοδοι
ΤΕΧΝΙΚΕΣ Αντικειμενοστραφουσ προγραμματισμου
Κεφάλαιο 2ο Πεπερασμένα αυτόματα.
ΗΥ 150 – ΠρογραμματισμόςΞενοφών Ζαμ π ούλης ΗΥ-150 Προγραμματισμός Αλγόριθμοι και Προγράμματα.
Αποκεντρωμένη Διοίκηση Μακεδονίας Θράκης ∆ιαχείριση έργων επίβλεψης µε σύγχρονα µέσα και επικοινωνία C2G, B2G, G2G Γενική Δ/νση Εσωτερικής Λειτουργίας.
ΘΠ06 - Μεταγλωττιστές Πίνακας Συμβόλων. Πίνακας Συμβόλων (Symbol Table) (Ι)  Είναι μια δομή στην οποία αποθηκεύονται τα ονόματα ενός προγράμματος και.
ΕΠΛ223 Θεωρία και Πρακτική Μεταγλωττιστών Εαρινό Εξάμηνο 2002 Κ. Μουρλάς, Λέκτορας Σημείωση: Οι διαφάνειες αυτές βασίζονται κατά το μεγαλύτερο μέρος τους.
Προγραμματισμός ΙΙ Διάλεξη #6: Απλές Δομές Ελέγχου Δρ. Νικ. Λιόλιος.
Δομές Δεδομένων 1 Στοίβα. Δομές Δεδομένων 2 Στοίβα (stack)  Δομή τύπου LIFO: Last In - First Out (τελευταία εισαγωγή – πρώτη εξαγωγή)  Περιορισμένος.
ΣΥΝΑΡΤΗΣΕΙΣ.
Τεχνολογία ΛογισμικούSlide 1 Αλγεβρική Εξειδίκευση u Καθορισμός τύπων αφαίρεσης σε όρους σχέσεων μεταξύ τύπων λειτουργιών.
Μοντέλα Συστημάτων Παρουσιάσεις των συστημάτων των οποίων οι απαιτήσεις αναλύονται.
Προγραμματισμός ΙΙ Διάλεξη #5: Εντολές Ανάθεσης Εντολές Συνθήκης Δρ. Νικ. Λιόλιος.
Εισαγωγή στον Προγραμματισμό, Αντώνιος Συμβώνης, ΣΕΜΦΕ, ΕΜΠ, Slide 1 Εβδομάδα 11: Εκτέλεση Java χωρίς το BlueJ.
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Κληρονομικότητα.
Ανάπτυξη Πρωτοτύπου Λογισμικού
2-1 Ανάλυση Αλγορίθμων Αλγόριθμος Πεπερασμένο σύνολο εντολών που, όταν εκτελεστούν, επιτυγχάνουν κάποιο επιθυμητό αποτέλεσμα –Δεδομένα εισόδου και εξόδου.
Βαρόμετρο ΕΒΕΘ - Καταναλωτές Μάρτιος “Η καθιέρωση ενός αξιόπιστου εργαλείου καταγραφής του οικονομικού, επιχειρηματικού και κοινωνικού γίγνεσθαι.
ΕΠΛ 223 Θεωρία και Πρακτική Μεταγλωττιστών7-1 Πίνακας Συμβόλων Πίνακας συμβόλων: δομή δεδομένων που χρησιμοποιείται για την αποθήκευση διαφόρων πληροφοριών.
1 ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Πίνακας Συμβόλων Symbol Table.
Για τη διεκπεραίωση ενός προβλήματος πρέπει να ακολουθηθεί η εξής διαδικασία:  να γραφεί ο αλγόριθμος να συνταχθεί το πρόγραμμα σε γλώσσα υψηλού επιπέδου.
1 Εισαγωγή στη Java Χρήσιμες Διευθύνσεις Χαρακτηριστικά της Java Εργαλεία της Java Εργαλεία της Java Μεταγλώττιση στοιχειωδών εφαρμογών.
Βάσεις Δεδομένων Εργαστήριο ΙΙ Τμήμα Πληροφορικής ΑΠΘ
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
Κεφάλαιο 10 – Υποπρογράμματα
Τμήμα Πληροφορικής και Τηλεπικοινωνιών
1 Τμήμα Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής Πανεπιστήμιο Πατρών ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ (C++) Τάξεις και Αφαίρεση Δεδομένων.
ΗΥ-340 Γλώσσες και Μεταφραστές Φροντιστήριο Syntax Directed Translation and alpha Language.
Μπόλαρη Αγγελικη(1451) Επιβλέπων Βολογιαννίδης Σταύρος ΑΤΕΙ ΣΕΡΡΩΝ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΕΠΙΚΟΙΝΩΝΙΩΝ Σέρρες 2013.
Γλώσσες Προγραμματισμού Μεταγλωττιστές Πίνακας Συμβόλων Πανεπιστήμιο Μακεδονίας Τμήμα Εφαρμοσμένης Πληροφορικής Ηλίας Σακελλαρίου.
Πληροφορική 2 Γλώσσες Προγραμματισμού 1. Γλώσσες προγραμματσιμού  Επιτρέπουν την κωδικοποίηση των αλγορίθμων  Η εκτέλεση ενός προγράμματος θα πρέπει.
Εισαγωγή στη C# Μαρίνος Θεμιστοκλέους Ανδρούτσου 150 Γραφείο 206 Τηλ Ώρες Γραφείου: Τετάρτη 5-6 μμ.
ΥΠΟΛΟΓΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ ΓΙΑ ΣΥΣΤΗΜΑΤΑ ΜΕΤΑΔΟΣΗΣ ΠΛΗΡΟΦΟΡΙΑΣ Αντικειμενοστραφής προγραμματισμός Web Site: ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ.
Windows Programming Web Forms.
ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ
Κατηγορίες και Προδιαγραφές Λογισμικού Η/Υ (Software)
Εισαγωγή στον Προγ/μό Υπολογιστών
Αντικειμενοστραφής Προγραμματισμός ΙΙ
Εισαγωγή στον Προγραμματισμό με Python, ΑΠΘ ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ Εισαγωγή στον Προγραμματισμό με Python Εβδομάδα 1: Βασικά στοιχεία.
Εισαγωγή στη Java (Μέρος Α’)
Εργασία στην JML Μάθημα: Τυπικές Μέθοδοι Ανάλυσης Συστημάτων
Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό (στη γλώσσα Java)
Μεταγράφημα παρουσίασης:

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

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

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

Που και πως «τρέχει» το .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 το οποίο αποτελεί εμπορικό προϊόν.

Τι προσπαθεί να πετύχει το .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!

Τυποποίηση του .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.

Γλώσσες Προγραμματισμού Υπάρχουν σχεδόν όλες οι γνωστές γλώσσες: 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

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

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.

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

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)]

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

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)

Βασικές Βιβλιοθήκες 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)

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.

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

Δημιουργία 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

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

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 κλπ)

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

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

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

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)

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

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

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 μεθόδων παράδοσης ενός μηνύματος

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

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

Εκτέλεση Διαχειριζόμενου κώδικα Φόρτωση εκτελέσιμης συνιστώσας (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 εντολές προφανώς αποθηκεύονται σε δυναμικά δεσμευμένο μέρος μνήμης.

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 κυρίως.

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 κλπ

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

Εγκατάσταση Εκτελέσιμα αρχεία Συνιστώσες: Απλή αντιγραφή τους στο σύστημα – στόχο (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.

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

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

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)

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

Διαχείριση Εφαρμογών Αρχεία διαχείρισης / ρυθμίσεων Σύνταξη 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 μιας εφαρμογής.

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

.NET Configuration MMC SnapIn

Παράδειγμα .config file Αρχείο προσδιορισμού θέσης: <configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="myAssembly" publicKeyToken="32ab4ba45e0a69a1" culture="en-us" /> <codeBase version="2.0.0.0" href="http://www.litwareinc.com/myAssembly.dll"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration> Παράδειγμα δήλωσης διαδρομής αναζήτησης assembly: <probing privatePath="bin;bin2\subbin;bin3"/> <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> <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)); }

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

Εργαλεία .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

Περισσότερες Πληροφορίες / Αναφορές Links: ECMA (http://www.ecma-international.org/) MS.NET (http://www.microsoft.com/NET/) MONO (http://www.go-mono.com/) Αναφορές: 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.

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

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.

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). Δεν έχουν μεταδεδομένα. Τα ονόματα των μεθόδων αλλοιώνονται. Δεν επιτρέπει πολλαπλή κληρονομικότητα.

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.

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:1.0.0.0

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

.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://127.0.0.1:4000/HelloDotNet" // Location ); h.SayHello( ); } catch(Exception e) Console.WriteLine(e.ToString( ));

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

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

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

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