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