反射发出技术示例

更新:2007 年 11 月

本示例说明如何使用反射发出。反射发出是一种运行库特征,允许代码创建动态程序集、模块和类型。可以动态地创建这些类型的实例加以使用,或者使用反射发出生成程序集并以可执行文件或 DLL 形式存储到磁盘上。本示例由两个可执行文件组成。第一个可执行文件 EmitAssembly.exe 生成一个动态类型并对其进行测试,或生成一个动态类型并将其以 DLL 形式存储到磁盘上。第二个可执行文件 TestEmittedAssembly.exe 仅测试 EmitAssembly.exe 动态发出的程序集。EmitAssembly.exe 发出的类型是一个名为“HelloWorld”的简单类,其构造函数采用单个字符串参数。此类型还实现了一个 GetGreeting() 方法,该方法用于返回传递给实例构造函数的字符串。

有关使用这些示例的信息,请参见下面的主题:

Download sample

使用命令提示生成示例

  1. 打开命令提示窗口,然后定位到该示例的语言特定子目录之一。

  2. 根据所选的编程语言,在命令行中键入 msbuild ReflectionEmitCS.sln 或 msbuild ReflectionEmitVB.sln。

  3. 通过编译 EmitAssembly 类生成测试程序集。根据您选择的编程语言,在命令行键入 csc /target:library EmitAssembly.cs 或 vbc /target:library TestEmittedAssembly.vb。结果输出文件为 EmitAssembly.dll。

使用 Visual Studio 生成示例

  1. 打开 Windows 资源管理器,然后定位到该示例的语言特定子目录之一。

  2. 根据所选择的编程语言,双击 ReflectionEmitCS.sln 或 ReflectionEmitVB.sln 的图标,从而在 Visual Studio 中打开该文件。

  3. 在“生成”菜单中选择“生成解决方案”。

  4. 通过生成 EmitAssembly 类来生成测试程序集。使用 EmitAssembly.cs 或 EmitAssembly.vb 文件创建“类库”项目并生成该项目。结果输出文件为 EmitAssembly.dll。

运行示例

  1. 打开命令提示窗口,然后定位到包含新的可执行文件的目录。

  2. 在命令行上键入 EmitAssembly.exe,后跟要作为参数传递的值。

y947hae6.alert_note(zh-cn,VS.90).gif说明:

该示例生成一个控制台应用程序。您必须在命令提示窗口中启动并运行它才能查看它的输出。

备注

有关反射发出的更多信息,请参见源代码文件中的注释。

y947hae6.alert_note(zh-cn,VS.90).gif说明:

MsBuild Tool 生成两个可执行文件:EmitAssembly.exe 和 TestEmittedAssembly.exe。但是,为了生成 TestEmittedAssembly.exe,编译器必须能够打开所引用的程序集“EmittedAssembly.dll”。生成 EmitAssembly.exe 后,MsBuild Tool 用命令行参数“2”执行 EmitAssembly,此参数指示该示例应发出动态程序集。

EmitAssembly 可执行文件接受一个用于指示所要执行的测试的命令行参数。如果此参数值为 1,则此示例将动态类型发出到它的 AppDomain 中并测试此示例中的静态成员。如果此参数值为 2,则此示例将动态类型发出到一个程序集中,并将此程序集以 .DLL 和 .MOD 文件的形式存储到磁盘。完成此操作后,您最好运行 TestEmittedAssembly.exe 或 ILDasm.exe 来测试所发出的代码。

例如:

TestEmittedAssembly.exe

ILDasm EmittedModule.mod

如果此参数值为 3,则此示例将动态类型发出到一个程序集,并发出第二个动态类型来测试第一个动态类型的代码。

此示例使用下面的技术和类:

请参见

参考

AppDomain

AssemblyBuilder

AssemblyBuilderAccess

AssemblyName

ConstructorBuilder

FieldBuilder

ILGenerator

MethodAttributes

MethodBuilder

MethodInfo

ModuleBuilder

ResolveEventHandler

System.IO

System.Reflection

System.Reflection.Emit

System.Threading

TypeBuilder

其他资源

反射

发出动态方法和程序集

动态源代码生成和编译

处理和引发事件

托管和非托管事件