|
|
Δημοσιεύτηκε στις 2021-3-21 12:38:34
|
|
|
|

Τα σενάρια εφαρμογών, με τον κώδικα C# μας, δημιουργούν δυναμικά ένα EXE, τα σενάρια εφαρμογής του μπορεί να είναι πάρα πολλά, όπως εξουσιοδότηση λογισμικού, μπορείτε να εισαγάγετε τις πληροφορίες εξουσιοδότησης, να δημιουργήσετε ένα εξουσιοδοτημένο DLL κ.λπ., οπότε πώς να επιτύχετε αυτή τη λειτουργία, πρέπει να αναφέρουμε ένα τεχνικό Emit.
1. Επισκόπηση του Emit
Εκπέμπω, μπορεί να ονομαστεί εκπομπή ή παραγωγή. Στο Framework, οι που σχετίζονται με το Emit υπάρχουν βασικά κάτω από τον χώρο ονομάτων System.Reflection.Emit. Μπορεί να φανεί ότι το Emit υπάρχει ως στοιχείο προβληματισμού. Μιλώντας για προβληματισμό, όλοι πρέπει να είναι εξοικειωμένοι με αυτόν, μας επιτρέπει να δούμε τα στοιχεία του συγκροτήματος, έτσι ώστε να λάβουμε μεγάλο όγκο πληροφοριών, όπως ποιους τύπους περιέχει το συγκρότημα, ποιες μεθόδους περιέχει ο τύπος κ.λπ. Αλλά οι αντανακλάσεις μπορούν μόνο να «φανούν», ενώ το Emit μπορεί να δημιουργήσει δυναμικά κώδικα κατά το χρόνο εκτέλεσης. Ας ρίξουμε μια ματιά στον τρόπο δημιουργίας κώδικα με το Emit.
2. Συναρμολόγηση και διαχειριζόμενη μονάδα
Μια συγκρότηση είναι μια λογική ομαδοποίηση μιας ή περισσότερων λειτουργικών ενοτήτων, αρχείων πόρων και δευτερευόντως μια συγκρότηση είναι η μικρότερη μονάδα επαναχρησιμοποίησης, ασφάλειας και εκδόσεων. Τα DLL και τα EXE που βλέπουμε μπορούν να ονομαστούν συναρμολόγηση, μια συναρμολόγηση περιέχει πολλές ενότητες, αλλά συνήθως, όταν μεταγλωττίζουμε VS, θα μεταγλωττίσουμε μόνο μία ενότητα, εάν θέλουμε να μεταγλωττίσουμε πολλές ενότητες σε μια συναρμολόγηση, πρέπει να χρησιμοποιήσουμε csc.exe υλοποίηση.
3. Δημιουργήστε δυναμικά λειτουργίες κώδικα
Αρχικά, πρέπει να καταλάβουμε από ποιον τύπο αντιπροσωπεύεται κάθε δυναμικός τύπος στο .NET.
Συναρμολόγηση: System.Reflection.Emit.AssemblyBuilder (ορίζει και αναπαριστά δυναμικές συναρμολογήσεις)
Κατασκευαστής: System.Reflection.Emit.ConstructorBuilder (ένας κατασκευαστής που ορίζει και αναπαριστά δυναμικές)
Προσαρμοσμένο χαρακτηριστικό: System.Reflection.Emit.CustomAttributeBuilder (βοηθά στη δημιουργία προσαρμοσμένων χαρακτηριστικών χρησιμοποιώντας παραμέτρους που μεταβιβάζονται από τον κατασκευαστή για τη δημιουργία χαρακτηριστικών για)
Απαρίθμηση: System.Reflection.Emit.EnumBuilder (εξηγεί και υποδεικνύει τον τύπο απαρίθμησης)
Συμβάν: System.Reflection.Emit.EventBuilder (συμβάν που ορίζει την κλάση)
Πεδίο: System.Reflection.Emit.FieldBuilder (Ορίζει και αναπαριστά πεδία.) δεν μπορεί να κληρονομήσει μια τέτοια κατηγορία)
Τοπικές μεταβλητές: System.Reflection.Emit.LocalBuilder (αντιπροσωπεύει τοπικές μεταβλητές μέσα σε μια μέθοδο ή κατασκευαστή)
Μέθοδος: System.Reflection.Emit.MethodBuilder (μια μέθοδος (ή κατασκευαστής) που ορίζει και αναπαριστά μια δυναμική κλάση)
Module: System.Reflection.Emit.ModuleBuilder (ορίζει και αναπαριστά ενότητες σε δυναμικές συγκροτήσεις)
Παράμετρος: System.Reflection.Emit.ParameterBuilder (δημιουργία ή συσχέτιση πληροφοριών παραμέτρων όπως παράμετροι μεθόδου, παράμετροι συμβάντος κ.λπ.)
Ιδιότητα: System.Reflection.Emit.PropertyBuilder (Καθορίστε τον τύπο της ιδιότητας)
Class: System.Reflection.Emit.TypeBuilder (ορίστε και δημιουργήστε μια νέα παρουσία της κλάσης κατά το χρόνο εκτέλεσης)
Το OpCode είναι μια περιγραφή μιας οδηγίας ενδιάμεσης γλώσσας (IL). Υπάρχουν πολλές οδηγίες για αυτό, μπορείτε να ελέγξετε τον επίσημο ιστότοπο της Microsoft:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
AssemblyBuilderΠεριορισμοί πρόσβασης πρόσβασης
AssemblyBuilderAccess.Run; Υποδεικνύει ότι η συγκρότηση μπορεί να εκτελεστεί, αλλά όχι να αποθηκευτεί. AssemblyBuilderAccess.Save; Υποδεικνύει ότι η συγκρότηση μπορεί να αποθηκευτεί, αλλά όχι να εκτελεστεί. AssemblyBuilderAccess.RunAndSave; Υποδεικνύει ότι η συγκρότηση μπορεί να αποθηκευτεί και να εκτελεστεί. AssemblyBuilderAccess.ReflectionOnly; Υποδεικνύει ότι οι συναρμολογήσεις μπορούν να χρησιμοποιηθούν μόνο σε ανακλαστικό περιβάλλον και δεν μπορούν να εκτελεστούν. AssemblyBuilderAccess.RunAndCollect; Υποδεικνύει ότι το συγκρότημα μπορεί να εκφορτωθεί και να ανακτηθεί η μνήμη.
Ο κωδικός έχει ως εξής:
Πρώτα, χρησιμοποιήστε το emit για να δημιουργήσετε κώδικα IL, στη συνέχεια, δημιουργήστε δυναμικά ένα συγκρότημα και, τέλος, φορτώστε το συγκρότημα και καλέστε τις μεθόδους του, όπως φαίνεται στο παρακάτω σχήμα:
Χρησιμοποιήστε το ILSpy για να δείτε τον κώδικα που δημιουργήθηκε όπως φαίνεται στην παρακάτω εικόνα:
(Τέλος)
|
Προηγούμενος:Η διαφορά μεταξύ του μεταγλωττιστή Roslyn MSBuildΕπόμενος:.NET/C# Δοκιμή απόδοσης ανάκλασης, εκπομπής, έκφρασης
|