反射发出允许为动态模块定义符号信息。 可以使用默认符号编写器接口或调用方特定的符号编写器接口定义符号信息。 反射发出在 System.Diagnostics.SymbolStore 命名空间中为低级别符号编写器接口提供方便的高级别抽象。
调用方必须通过调用适当的方法以定义动态模块,表明动态模块将包含符号信息的意图。 定义动态模块中描述了各种用符号信息创建动态模块的选项。 为没有用包含符号信息的意图创建的动态模块调用符号编写器方法是错误的。
反射发出提供下列发出符号信息的方法:
使用 ModuleBuilder.GetSymWriter 方法可获取与动态模块关联的符号编写器接口。
使用 ModuleBuilder.SetUserEntryPoint 方法可以定义动态模块的用户入口点。 用户入口点是用户已标识为入口点的方法,而不是用户在主方法之前生成的存根 (stub)。
使用 ModuleBuilder.DefineDocument 方法定义 Document 对象。
存储在符号存储区中的自定义特性是分别使用 ModuleBuilder.SetSymCustomAttribute、MethodBuilder.SetSymCustomAttribute 和 ConstructorBuilder.SetSymCustomAttribute 方法为模块、方法和构造函数定义的。
序列点是使用 ILGenerator.MarkSequencePoint 方法标识的。
词法范围是使用 ILGenerator.BeginScope 和 ILGenerator.EndScope 方法定义的。
使用 LocalBuilder.SetLocalSymInfo 方法可以设置方法或构造函数中的局部变量的名称。 也可以指定局部变量的词法范围。 LocalBuilder 对象是通过调用 ILGenerator.DeclareLocal 获取的。