第11章使用类元数据_第1页
第11章使用类元数据_第2页
第11章使用类元数据_第3页
第11章使用类元数据_第4页
第11章使用类元数据_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第11章章 使用类型元数据使用类型元数据.net framework 2.0 程序设计程序设计第第 1 章:章: .net framework 2.0简介简介 第第 2 章:公共语言运行库和章:公共语言运行库和类型类型 第第 3 章:托管代码的编译和章:托管代码的编译和执行执行 第第 4 章:委托和事件章:委托和事件 第第 5 章:读取和写入文件章:读取和写入文件 第第 6 章:集合和泛型章:集合和泛型 第第 7 章:数据的序列化章:数据的序列化 第第 8 章:章:gdi+ 第第 9 章:章:在在 .net framework 2.0中实现加密中实现加密第第 10 章:章: com 组件与组

2、件与.net framework程序集之间的交程序集之间的交互操作互操作 第第 11 章:章:使用类型元数据使用类型元数据 第第 12 章:创建多线程应用章:创建多线程应用程序和应用程序域程序和应用程序域 第第 13 章:代码访问安全性章:代码访问安全性 第第 14 章:监视和调试应用章:监视和调试应用程序程序 第第 15 章:使用服务应用程章:使用服务应用程序和电子邮件消息序和电子邮件消息 第第 16 章:创建全球化应用章:创建全球化应用程序程序 第第 17 章:配置和安装程序章:配置和安装程序集集 本章学习目标:本章学习目标:通过通过assembly、memberinfo、methodbo

3、dy 和和localvariableinfo类型和程序集属性使用类型元类型和程序集属性使用类型元数据数据 通过生成器类和绑定类型动态地使用程序集通过生成器类和绑定类型动态地使用程序集 目标目标 通过预定义的通过预定义的 assembly 类使用类型元数据类使用类型元数据 通过自定义类动态使用程序集通过自定义类动态使用程序集小结小结实验实验习题习题第第11章章 使用类型元数据使用类型元数据反射反射使用使用 assembly 类访问类型元数据类访问类型元数据使用使用memberinfo类研究类型元数据类研究类型元数据(1)type类及其子类类及其子类 (2) methodbase类类 (3) ev

4、entinfo类类 (4) fieldinfo类类 (5) propertyinfo类类 使用使用methodbody类检查方法的内容类检查方法的内容 使用程序集属性向元数据添加自定义信息使用程序集属性向元数据添加自定义信息 通过预定义的通过预定义的 assembly 类使类使用类型元数据用类型元数据 11.1 通过预定义的通过预定义的 assembly 类使类使用类型元数据用类型元数据反射反射 11.1.1反射反射反射是在运行时检查程序集清单中的元数据的功能。反射是在运行时检查程序集清单中的元数据的功能。 程序集的元数据提供程序集和程序集中所有类型(包括泛型类程序集的元数据提供程序集和程序集

5、中所有类型(包括泛型类型)的相关信息。型)的相关信息。 程序集由模块组成,模块由类型组成,而类型包含成员。程序集由模块组成,模块由类型组成,而类型包含成员。 .net framework 提供了提供了system.type类并在类并在system.reflection命名命名空间中提供了很多类,这些类可用于执行反射。空间中提供了很多类,这些类可用于执行反射。 使用使用 assembly 类访问类访问类型元数据类型元数据 11.1.2使用使用 assembly 类访问类型元数据类访问类型元数据assembly 类的静态方法:类的静态方法: 方法方法描述描述getassembly此方法返回定义了指

6、定类的程序集。getcallingassembly此方法返回调用当前正在执行的方法的方法的程序集。getentryassembly此方法返回在默认应用程序域中的进程可执行文件。在其他应用程序域中,这是由appdomain.executeassembly执行的第一个进程可执行文件。getexecutingassembly此方法返回包含当前正在执行的代码的程序集。使用使用 assembly 类来访问类来访问类型元数据类型元数据 (续)(续)11.1.2使用使用 assembly 类来访问类型元数据类来访问类型元数据load此方法加载并解析程序集中的依赖项。依赖程序集必须位于应用程序的根目录、pri

7、vate bin 路径或全局程序集缓存中。loadfile此方法加载为其指定了文件名或路径的程序集文件的内容。与load方法不同,loadfile方法不解析程序集中的依赖项,因此需要在使用此方法时预先加载所有依赖程序集。loadfrom在给定程序集的文件名或路径的情况下,此方法加载程序集文件的内容。程序集的路径是基于当前目录的相对路径,而程序集会被加载到调用方的域中。loadmodule此方法加载程序集的内部模块。代码示例代码示例c#代码示例代码示例vb续表续表:使用使用memberinfo类类研究类型元数据研究类型元数据 11.1.3使用使用memberinfo类类研究类型元数据研究类型元数

8、据memberinfo类的成员:类的成员: 成员成员描述描述declaringtype此属性检索声明成员的类的名称。membertype该属性检索方法、构造函数、模块或字段等成员类型。metadatatoken与module方法一同使用时,此属性返回一个惟一标识元数据元素的值。module此属性返回在其中定义了成员的模块。使用使用memberinfo类类研究类型元数据(续)研究类型元数据(续)11.1.3使用使用memberinfo类类研究类型元数据研究类型元数据name此属性检索当前成员的名称。reflectedtype此属性检索用于获取memberinfo类的实例的对象类型。getcust

9、omattributes此属性返回应用于成员的所有属性。所有派生类都必须重写此方法。gettype此方法继承自system.object,返回当前实例的system.type。isdefined此方法指示某个特定属性是否应用于某成员。所有派生类都必须重写此方法。如果attributetype的一个或多个实例应用于某成员,则此方法返回 true;否则将返回false。续表续表:type类及其子类类及其子类 methodbase类类 eventinfo类类 fieldinfo类类 propertyinfo类类 .net framework 提供了几个类,可以使用它们来访问元数据成员的提供了几个类,

10、可以使用它们来访问元数据成员的信息信息 。使用使用memberinfo类类研究类型元数据研究类型元数据 (续)(续)11.1.3使用使用memberinfo类类研究类型元数据研究类型元数据使用使用memberinfo类研类研究类型元数据(续)究类型元数据(续) type类具有以下子类:类具有以下子类: 11.1.3使用使用memberinfo类研究类型类研究类型元数据元数据enumbuilder:描述并表示一个枚举。:描述并表示一个枚举。generictypeparameterbuilder:定义和创建动态定:定义和创建动态定义的泛型类型的泛型参数。义的泛型类型的泛型参数。 typebuild

11、er:在运行时定义并创建类的新实例。:在运行时定义并创建类的新实例。 typedelegator:包装一个类型对象并将所有方法:包装一个类型对象并将所有方法委托给类型。委托给类型。 代码示例代码示例c代码示例代码示例vb11.1.3使用使用memberinfo类类研究类型元数据研究类型元数据methodbase 类的成员:类的成员: 成员成员描述描述attributes此属性返回与方法关联的属性。declaringtype此属性返回声明成员的类。isconstructor此方法指示方法是否为构造函数。isprivate此属性指示方法是否为私有。ispublic此属性指示方法是否为公共。isvi

12、rtual此属性指示方法是否为虚拟。getparameters此方法返回方法的参数。代码示例代码示例c代码示例代码示例vb使用使用memberinfo类研类研究类型元数据(续)究类型元数据(续) 11.1.3使用使用memberinfo类类研究类型元数据研究类型元数据eventinfo类的成员:类的成员: 成员成员描述描述attributes此属性(property)返回事件的属性(attribute)。ismulticast此属性返回一个boolean值,它指示此事件是否可保持一个以上的事件处理方法的引用。isspecialname此属性指示此事件名称是否具有特殊意义。以下划线(_)开头或包

13、含下划线的名称、以及属性访问器和运算符重载方法的名称需要一些编译器的特殊处理。 name此属性返回事件的名称。代码示例代码示例c代码示例代码示例vb使用使用memberinfo类研类研究类型元数据(续)究类型元数据(续) 11.1.3使用使用memberinfo类类研究类型元数据研究类型元数据fieldinfo类的成员:类的成员: 成员成员描述描述fieldtype此属性返回字段的类型。isinitonly此属性返回一个boolean值,它指示此字段是否只能在构造函数的主体中设置。isliteral该属性返回一个boolean 值,此值指示字段是否为常数。isspecialname该属性返回一

14、个boolean 值,此值指示字段是否具有specialname属性。isstatic该属性返回一个boolean 值,此值指示字段是否为静态成员。代码示例代码示例c代码示例代码示例vb使用使用memberinfo类研类研究类型元数据(续)究类型元数据(续) 11.1.3使用使用memberinfo类类研究类型元数据研究类型元数据propertyinfo类的成员:类的成员: 成员成员描述描述attributes此属性(property)获取某一属性(property)的属性(attribute)。canread此属性获取一个 boolean 值,此值指示属性是否可读。canwrite此属性获取

15、一个 boolean 值,此值指示是否可写入属性。name此属性获取属性名。propertytype此属性获取属性的类型。代码示例代码示例c代码示例代码示例vb使用使用memberinfo类研类研究类型元数据(续)究类型元数据(续) 使用使用methodbody类类检查方法的内容检查方法的内容 11.1.4使用使用methodbody类检查方法的内容类检查方法的内容methodbody类的成员:类的成员: 成员成员描述描述exceptionhandlingclauses此属性返回方法内的异常处理从句。initlocals此属性返回一个boolean值,它指示方法主体中的局部变量是否已初始化为其

16、对应类型的默认值。localsignaturemetadatatoken此属性返回签名的一个元数据标记,该签名使用元数据描述方法中的局部变量。localvariables此属性返回方法主体中所声明的局部变量的列表。maxstacksize此属性返回方法执行时操作数堆栈上的最大项数。getilasbytearray此方法将方法主体的msil代码作为字节数组返回。代码示例代码示例c代码示例代码示例vb使用使用methodbody类类检查方法的内容检查方法的内容 11.1.4使用使用methodbody类检查方法的内容类检查方法的内容localvariableinfo类的成员:类的成员: 成员成员描

17、述描述ispinned此属性返回一个boolean 值,此值指示此变量是否固定在内存中。如果对象是固定的,则不能通过垃圾回收将其移动。localindex此属性返回方法主体内局部变量的索引。localtype此属性返回局部变量的类型。代码示例代码示例c代码示例代码示例vb使用程序集属性向元数使用程序集属性向元数据添加自定义信息据添加自定义信息 11.1.5使用程序集属性向使用程序集属性向元数据添加自定义信息元数据添加自定义信息程序集是自我描述的,可使用程序集属性添加详细程序集是自我描述的,可使用程序集属性添加详细的信息。的信息。 在在visual studio项目中,可在项目中,可在assem

18、blyinfo文件中添加文件中添加程序集属性。程序集属性。 在在vb.net项目中,项目中,assemblyinfo文件位于解决方案资文件位于解决方案资源管理器中的源管理器中的my project文件夹中。文件夹中。 在在c#项目中,项目中,assemblyinfo文件位于解决方案资源管文件位于解决方案资源管理器的理器的properties文件夹中。文件夹中。 通过预定义的通过预定义的 assembly 类使用类型元数据类使用类型元数据 通过自定义类动态使用程序集通过自定义类动态使用程序集小结小结实验实验习题习题第第11章章 使用类型元数据使用类型元数据使用生成器类动态创建程序集使用生成器类动

19、态创建程序集绑定绑定 使用绑定类型控制成员绑定使用绑定类型控制成员绑定通过自定义类动态通过自定义类动态使用程序集使用程序集 11.2 通过自定义类动态使用程序集通过自定义类动态使用程序集.net framework 提供了可用于在运行时动态创建程序提供了可用于在运行时动态创建程序集的自定义类。集的自定义类。 各种生成器类的作用。各种生成器类的作用。 使用生成器类动态使用生成器类动态创建程序集创建程序集 11.2.1使用生成器类动态创建程序集使用生成器类动态创建程序集类类描述描述modulebuilder此类用于定义并表示模块。需要使用 assembly.definedynamicmodule

20、方法来创建一个 modulebuilder 类的实例。创建动态程序集之后,可以使用 assemblybuilder.definemodule 来创建模块。默认情况下,模块将保存为.dll 文件。如果想创建一个 .exe 文件,则必须调用 assemblybuilder.setentrypoint 方法来指示将哪种方法作为应用程序入口点。enumbuilder此类用于定义并表示枚举。可以使用 methodbuilder.defineenum 方法来创建一个enumbuilder类的实例。typebuilder此类用于在运行库内定义类、添加方法和字段。需要使用 modulebuilder.defi

21、netype 方法来创建一个typebuilder 类的实例。使用 modulebuilder 类创建好模块之后,可以在该模块中创建类型。constructorbuilder此类用于定义类的构造函数。需要使用 typebuilder.defineconstructor 方法来创建一个constructorbuilder 类的实例。代码示例代码示例c代码示例代码示例vb使用生成器类动态使用生成器类动态创建程序集创建程序集 (续)(续)11.2.1使用生成器类动态创建程序集使用生成器类动态创建程序集eventbuilder此类用于定义类的事件。需要使用 typebuilder.defineeven

22、t 方法来创建一个eventbuilder 类的实例。fieldbuilder此类用于定义字段。需要使用 typebuilder.definefield 方法来创建一个 fieldbuilder 类的实例。propertybuilder此类用于定义类中的属性。需要使用 typebuilder.defineproperty 方法来创建一个 propertybuilder 类的实例。methodbuilder此类用于表示类的方法或构造函数。需要使用 typebuilder.definemethod 方法来创建一个methodbuilder 类的实例。续表续表:使用生成器类动态使用生成器类动态创建程

23、序集创建程序集 (续)(续)11.2.1使用生成器类动态创建程序集使用生成器类动态创建程序集parameterbuilder此类用于定义参数。需要使用 methodbuilder.defineparameter 方法来创建一个parameterbuilder 类的实例。generictypeparameterbuilder此类用于为动态定义的泛型类型与方法定义和创建泛型类型参数。localbuilder此类用于定义方法或构造函数内的局部变量。需要使用 methodbuilder.declarelocal 方法来创建一个localbuilder 类的实例。ilgenerator此类用于生成 ms

24、il 代码。很多生成器类(例如,methodbuilder 和 propertybuilder)需要生成 msil 代码。可以使用 ilgenerator 类的 emit 方法实现此功能。要使用 ilgenerator 类,需要理解 msil 代码。如果你对 msil 代码不是很熟悉,那么ildasm.exe将是启动这种代码的最佳方案。可以使用该工具检查现有程序集的 msil 代码。所以,可以创建一个程序集,让它包含要用于动态类的代码,然后在ildasm.exe中查看这些代码,以了解需要从ilgenerator 类中传出的内容。续表续表:绑定是寻找与指定类型(此类型必须唯一)相对应绑定是寻找与

25、指定类型(此类型必须唯一)相对应的实现的过程。有两种绑定类型:早期绑定和晚期的实现的过程。有两种绑定类型:早期绑定和晚期绑定。绑定。 绑定绑定 11.2.2绑定绑定1.早期绑定对象允许编译器在应用程序执行前分配内存和执早期绑定对象允许编译器在应用程序执行前分配内存和执行其他优化。行其他优化。 2.晚期绑定发生在直至运行时才将变量设置为特定类型的情晚期绑定发生在直至运行时才将变量设置为特定类型的情况。况。 使用绑定类型使用绑定类型控制成员绑定控制成员绑定 11.2.3使用绑定类型控制成员绑定使用绑定类型控制成员绑定1.当在运行时动态加载类和使用晚期绑定时,必当在运行时动态加载类和使用晚期绑定时,

26、必须使用绑定标志来控制绑定对象的过程。使用须使用绑定标志来控制绑定对象的过程。使用 bindingflags 枚举可以实现这一点。枚举可以实现这一点。 2.要在运行时动态加载类型,必须首先加载程序要在运行时动态加载类型,必须首先加载程序集。可以使用集。可以使用 system.activator.createinstance 方方法来创建动态加载类型的实例。法来创建动态加载类型的实例。 代码示例代码示例c通过预定义的通过预定义的 assembly 类使用类型元数据类使用类型元数据 通过自定义类动态使用程序集通过自定义类动态使用程序集小结小结实验实验习题习题第第11章章 使用类型元数据使用类型元数

27、据11.3小结小结本章主要介绍了如何在本章主要介绍了如何在.net framework中使用类型中使用类型元数据。要使用类型元数据,就需要用到反射。反元数据。要使用类型元数据,就需要用到反射。反射是射是.net framework中的重点之一,中的重点之一,ide的很多功能的很多功能都是通过反射来实现的。使用反射技术,可以在代都是通过反射来实现的。使用反射技术,可以在代码中编写代码,动态创建和使用程序集。码中编写代码,动态创建和使用程序集。 小结小结 通过预定义的通过预定义的 assembly 类使用类型元数据类使用类型元数据 通过自定义类动态使用程序集通过自定义类动态使用程序集小结小结实验实

28、验习题习题第第11章章 使用类型元数据使用类型元数据实验实验11.4实验实验参照实验手册,并在教师指导参照实验手册,并在教师指导下完成实验报告。下完成实验报告。 通过预定义的通过预定义的 assembly 类使用类型元数据类使用类型元数据 通过自定义类动态使用程序集通过自定义类动态使用程序集小结小结实验实验习题习题第第11章章 使用类型元数据使用类型元数据习题习题11.5 习题习题1. 你在开发一个执行代码分析和生成报告的应你在开发一个执行代码分析和生成报告的应用程序,而且打算向软件开发项目经理销售用程序,而且打算向软件开发项目经理销售该应用程序。默认情况下,该应用程序加载该应用程序。默认情况

29、下,该应用程序加载一个完整的程序集来生成分析报告。但是,一个完整的程序集来生成分析报告。但是,为了适合于具有数百个项目的超大型开发团为了适合于具有数百个项目的超大型开发团队,你必须包含一个允许项目经理通过输入队,你必须包含一个允许项目经理通过输入类名来查找程序集的功能。以下哪个方法可类名来查找程序集的功能。以下哪个方法可用于完成此任务?用于完成此任务?请选择一个最佳答案。请选择一个最佳答案。aassembly.reflectiononlyloadbassembly.loadfromcassembly.loadmoduledassembly.getassembly习题(续)习题(续)2. 如果需

30、要为具有强名称的程序集签名,以如果需要为具有强名称的程序集签名,以使你可以将此程序集安装到全局程序集缓使你可以将此程序集安装到全局程序集缓存中,那么要将以下哪个属性应用于该程存中,那么要将以下哪个属性应用于该程序集?序集?请选择一个最佳答案。请选择一个最佳答案。aassemblykeyfileattributebdelaysignattributecassemblyconfigurationattributedassemblyflagsattribute11.5 习题习题习题(续)习题(续)3. 如果要为如果要为 visual studio 2005 创建一个扩充程创建一个扩充程序,该扩充程序将增强序,该扩充程序将增强 intell

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论