Emitting Symbolic Information with Reflection EmitÂ
Reflection emit allows symbolic information to be defined for a dynamic module. Symbolic information can be defined using the default symbol writer interface or a caller-specified symbol writer interface. Reflection emit provides a convenient high-level abstraction of the low-level symbol writer interfaces in the System.Diagnostics.SymbolStore namespace.
The caller must express an intention that a dynamic module will contain symbolic information by calling the appropriate method to define the dynamic module. The various options for creating dynamic modules with symbolic information are described in Defining a Dynamic Module. It is an error to call a symbol writer method for a dynamic module that has not been created with the intention of containing symbolic information.
Reflection emit provides the following methods for emitting symbolic information:
The symbol writer interface associated with a dynamic module can be obtained using the ModuleBuilder.GetSymWriter method.
The user entry point for a dynamic module can be defined using the ModuleBuilder.SetUserEntryPoint method. The user entry point is the method that the user has identified as the entry point rather than the caller-generated stubs before the main method.
Document objects are defined using the ModuleBuilder.DefineDocument method.
Custom attributes stored in the symbol store are defined for modules, methods, and constructors using the ModuleBuilder.SetSymCustomAttribute, MethodBuilder.SetSymCustomAttribute, and ConstructorBuilder.SetSymCustomAttribute methods, respectively.
Sequence points are identified using the ILGenerator.MarkSequencePoint method.
Lexical scopes are defined using the ILGenerator.BeginScope and ILGenerator.EndScope methods.
The name of a local variable in a method or a constructor can be set using the LocalBuilder.SetLocalSymInfo method. Optionally, the lexical scope of the local variable can be specified. A LocalBuilder object is obtained by calling ILGenerator.DeclareLocal.