Émission d'informations symboliques avec l'émission de réflexion
Reflection Emit permet de définir des informations symboliques pour un module dynamique. Les informations symboliques peuvent être définies en utilisant l'interface writer du symbole par défaut ou l'interface writer du symbole spécifiée par l'appelant. Reflection Emit fournit une abstraction de haut niveau pratique des interfaces writer de symbole de bas niveau dans l'espace de noms System.Diagnostics.SymbolStore.
L'appelant doit demander qu'un module dynamique contienne des informations symboliques en appelant la méthode appropriée pour définir le module dynamique. Les différentes options permettant de créer des modules dynamiques avec des informations symboliques sont décrites dans la section Définition d'un module dynamique. Il est erroné d'appeler une méthode writer de symbole pour un module dynamique qui n'a pas été créé avec l'intention de contenir des informations symboliques.
Reflection Emit fournit les méthodes suivantes pour émettre des informations symboliques :
L'interface writer de symbole associée à un module dynamique peut être obtenue en utilisant la méthode ModuleBuilder.GetSymWriter.
Le point d'entrée de l'utilisateur pour un module dynamique peut être défini en utilisant la méthode ModuleBuilder.SetUserEntryPoint. Le point d'entrée de l'utilisateur correspond à la méthode identifiée par l'utilisateur comme le point d'entrée à la place des stubs générés par l'appelant avant la méthode principale.
Les objets document sont définis en utilisant la méthode ModuleBuilder.DefineDocument.
Les attributs personnalisés stockés dans le magasin des symboles sont définis pour les modules, les méthodes et les constructeurs en utilisant, respectivement, les méthodes ModuleBuilder.SetSymCustomAttribute, MethodBuilder.SetSymCustomAttribute et ConstructorBuilder.SetSymCustomAttribute.
Les points de séquence sont identifiés en utilisant la méthode ILGenerator.MarkSequencePoint.
Les portées lexicales sont définies en utilisant les méthodes ILGenerator.BeginScope et ILGenerator.EndScope.
Le nom d'une variable locale dans une méthode ou un constructeur peut être défini en utilisant la méthode LocalBuilder.SetLocalSymInfo. La portée lexicale de la variable locale peut être éventuellement spécifiée. Un objet LocalBuilder est obtenu en appelant ILGenerator.DeclareLocal.