Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 50355|Απάντηση: 0

[Πηγή] .NET/C# Το Emit δημιουργεί δυναμικά συγκροτήματα

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 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# Δοκιμή απόδοσης ανάκλασης, εκπομπής, έκφρασης
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com