更新:2007 年 11 月
本示例说明如何使用反射发出。反射发出是一种运行库特征,允许代码创建动态程序集、模块和类型。可以动态地创建这些类型的实例加以使用,或者使用反射发出生成程序集并以可执行文件或 DLL 形式存储到磁盘上。本示例由两个可执行文件组成。第一个可执行文件 EmitAssembly.exe 生成一个动态类型并对其进行测试,或生成一个动态类型并将其以 DLL 形式存储到磁盘上。第二个可执行文件 TestEmittedAssembly.exe 仅测试 EmitAssembly.exe 动态发出的程序集。EmitAssembly.exe 发出的类型是一个名为“HelloWorld”的简单类,其构造函数采用单个字符串参数。此类型还实现了一个 GetGreeting() 方法,该方法用于返回传递给实例构造函数的字符串。
有关使用这些示例的信息,请参见下面的主题:
使用命令提示生成示例
打开命令提示窗口,然后定位到该示例的语言特定子目录之一。
根据所选的编程语言,在命令行中键入 msbuild ReflectionEmitCS.sln 或 msbuild ReflectionEmitVB.sln。
通过编译 EmitAssembly 类生成测试程序集。根据您选择的编程语言,在命令行键入 csc /target:library EmitAssembly.cs 或 vbc /target:library TestEmittedAssembly.vb。结果输出文件为 EmitAssembly.dll。
使用 Visual Studio 生成示例
打开 Windows 资源管理器,然后定位到该示例的语言特定子目录之一。
根据所选择的编程语言,双击 ReflectionEmitCS.sln 或 ReflectionEmitVB.sln 的图标,从而在 Visual Studio 中打开该文件。
在“生成”菜单中选择“生成解决方案”。
通过生成 EmitAssembly 类来生成测试程序集。使用 EmitAssembly.cs 或 EmitAssembly.vb 文件创建“类库”项目并生成该项目。结果输出文件为 EmitAssembly.dll。
运行示例
打开命令提示窗口,然后定位到包含新的可执行文件的目录。
在命令行上键入 EmitAssembly.exe,后跟要作为参数传递的值。
![]() |
---|
该示例生成一个控制台应用程序。您必须在命令提示窗口中启动并运行它才能查看它的输出。 |
备注
有关反射发出的更多信息,请参见源代码文件中的注释。
![]() |
---|
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 此示例使用 AppDomain 类型在此示例的 AppDomain 中创建一个动态程序集。它通过调用 DefineDynamicAssembly 方法来执行此操作。
AssemblyBuilder 用于生成动态程序集。用它可创建一个供立即使用的程序集,也可创建一个能够存储到 DLL 或 EXE 文件的动态程序集。
AssemblyName 用于定义程序集的唯一标识。此示例通过为动态程序集指定一个文本名称“EmittedAssembly”,以尽可能简单的方式使用此类型。
ModuleBuilder 用于在动态程序集中生成动态模块。
TypeBuilder 用于动态生成类型。此类型是从 Type 派生的。可以从该类型请求 FieldBuilder、ConstructorBuilder 和 MethodBuilder 类型的实例。此示例使用这些类型生成一个完整类型。
FieldBuilder 用于在动态类型中创建字段。
ConstructorBuilder 用于在动态类型中定义构造函数。
MethodBuilder 用于在动态类型中定义方法。
ILGeneratorMethodBuilder 和 ConstructorBuilder 实现了 GetILGenerator 方法。这些方法返回 ILGenerator 类型的一个实例,此实例用于动态生成类型的 Microsoft 中间语言 (MSIL) 代码。