Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 50355|Répondre: 0

[Source] .NET/C# Emit génère dynamiquement des assemblages

[Copié le lien]
Publié le 2021-03-21 à 12:38:34 | | | |
Les scénarios applicatifs, selon notre code C#, génèrent dynamiquement un EXE, dont les scénarios d’application peuvent être très nombreux, comme l’autorisation logicielle, vous pouvez saisir les informations d’autorisation, générer une DLL autorisée, etc., donc pour obtenir cette fonction, il faut mentionner une émission technique.

1. Aperçu d’Emit

Émettre, peut être appelé émetteur ou générateur. Dans Framework, les classes liées à Emit existent essentiellement sous l’espace de noms System.Reflection.Emit. On peut voir qu’Emit existe comme un élément de réflexion. En parlant de réflexion, tout le monde devrait être familier avec elle, elle nous permet d’observer les éléments de l’assemblage, afin d’obtenir une grande quantité d’informations telles que les types que contient l’assemblage, les méthodes que contient le type, etc. Mais les réflexions ne peuvent être « vues » qu’à l’exécution, tandis qu’Emit peut générer du code dynamiquement à l’exécution. Voyons comment générer du code avec Emit.

2. Module d’assemblage et de gestion

Un assembleur est un regroupement logique d’un ou plusieurs modules, fichiers ressource, et secondairement, un assembleur est la plus petite unité de réutilisation, de sécurité et de versionnement. Les DLL et EXE que nous voyons peuvent être appelés un assembleur, un assembleur contient plusieurs modules, mais généralement, lorsque nous compilons en VS, nous ne compilons qu’un seul module, si nous voulons compiler plusieurs modules dans un assembleur, nous devons utiliser csc.exe implémentation.

3. Générer dynamiquement des opérations de code

Tout d’abord, il faut comprendre quel type de type dynamique est représenté dans .NET.

Assembleur : System.Reflection.Emit.AssemblyBuilder (définit et représente les assemblages dynamiques)

Constructeur : System.Reflection.Emit.ConstructorBuilder (un constructeur qui définit et représente des classes dynamiques)

Attribut personnalisé : System.Reflection.Emit.CustomAttributeBuilder (aide à générer des attributs personnalisés en utilisant les paramètres passés par le constructeur pour générer des attributs pour les classes)

Enum : System.Reflection.Emit.EnumBuilder (explique et indique le type d’enum)

Event : System.Reflection.Emit.EventBuilder (événement qui définit la classe)

Champ : System.Reflection.Emit.FieldBuilder (Définit et représente les champs.) ne peut pas hériter d’une telle classe)

Variables locales : System.Reflection.Emit.LocalBuilder (représente les variables locales au sein d’une méthode ou d’un constructeur)

Méthode : System.Reflection.Emit.MethodBuilder (une méthode (ou constructeur) qui définit et représente une classe dynamique)

Module : System.Reflection.Emit.ModuleBuilder (définit et représente des modules dans des assemblages dynamiques)

Paramètre : System.Reflection.Emit.ParameterBuilder (créer ou associer des informations de paramètres telles que paramètres de méthode, paramètres d’événement, etc.)

Propriété : System.Reflection.Emit.PropertyBuilder (Définir le type de propriété)

Classe : System.Reflection.Emit.TypeBuilder (définir et créer une nouvelle instance de la classe à l’exécution)

OpCode est une description d’une directive d’un langage intermédiaire (IL). Il y a beaucoup d’instructions à ce sujet, vous pouvez consulter le site officiel de Microsoft :La connexion hyperlientérée est visible.

Restrictions d’accès à AssemblyBuilderAccess

AssemblyBuilderAccess.Run ; Indique que l’assemblage peut être exécuté, mais pas sauvegardé.
AssemblyBuilderAccess.Save ; Indique que l’assemblage peut être sauvegardé, mais pas exécuté.
AssemblyBuilderAccess.RunAndSave ; Indique que l’assemblage peut être sauvegardé et exécuté.
AssemblyBuilderAccess.ReflectionOnly ; Indique que les assemblages ne peuvent être utilisés que dans un contexte réflexif et ne peuvent pas être exécutés.
AssemblyBuilderAccess.RunRunAndCollect ; Indique que l’assembleur peut être déchargé et que la mémoire est récupérée.

Le code est le suivant :

D’abord, utilisez emit pour générer du code IL, puis générez dynamiquement un assemblage, et enfin, chargez l’assemblage et appelez ses méthodes, comme montré dans la figure ci-dessous :



Utilisez ILSpy pour visualiser le code généré tel que montré sur l’image ci-dessous :



(Fin)





Précédent:La différence entre le compilateur Roslyn MSBuild
Prochain:Tests de performance de réflexion, émission et expression .NET/C#
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com