2.Net本质论中文版.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2.Net本质论中文版

第二章 组件 CLR对组件代码的打包、部署和查找有自己一整套的概念和技术。这些概念和技术与COM、Java和Win32存在着根本上的差别。如果进一步认识CLR加载器,就能够很好地理解它们之间的差异。不过,我们必须先知道代码和元数据是如何打包的。 模块定义 CLR程序存在模块(module)中。一个CLR模块是一个字节流,通常作为一个文件存储在本地的文件系统中或者Web服务器上。 如图2.1所示,CLR模块采用Windows NT的PE/COFF可执行文件格式的扩展版。不过,CLR对PE/COFF文件格式进行了很大的扩展,而不是简单的沿袭。同时,CLR模块也是有效的Win32模块,可以通过LoadLibrary系统调用进行加载。不过,CLR模块用到的PE/COFF的功能极少。准确地说,CLR模块的大部分内容是作为不透明的数据,存放在PE/COFF文件的.text部分。 CLR模块包含代码、元数据和资源。代码一般以公共中间语言[common intermediate language(CIL)]的格式存放(尽管代码也可能被存为特定处理器的机器指令)。模块的元数据描述了模块中定义的类型,包含名字、 PE头 COFF头 IMAGE_COR20_HEADER 代码 (CIL和/或本机机器码 资源数据 字符串/BLOB池 元数据表 继承关系、方法签名和依赖信息等。模块的资源由静态的只读数据组成,例如,字符串、位图,以及其他没有被存储为可执行代码的部分。 CLR模块使用的文件格式具有较好的文档性,开发人员很少也会遇到未加工的格式。因此,即使对于急于求成的开发人员,一般也能够使用CLR提供的两个实用部件中的一个,用来进行可编程地生成模块。IMetaDataEmit接口是低级的COM接口,可以用来由经典的C++编程生成模块元数据。System.Reflection.Emit命名空间是高级的类库,用来由任何CLR正式语言(例如,C#、VB.NET)编程生成元数据和CIL。CodeDOM则工作在更高级的抽象层面上,不必知道和理解CIL。然而,对绝大多数开发人员来说,他们只是需要在开发时生成代码,而不是运行时,对此CLR编译器完全能够胜任。 C#编译器(CSC.EXE)、VB.NET编译器(VBC.EXE)和C++编译器(CL.EXE)都能够将源代码翻译成CLR模块。各个编译器通过命令行开关控制产生的 表2.1 模块输出选项 C# / VB.NET C++ 直接可加载的? 从Shell中可直接运行? 可访问控制台? /t:exe /CLR 是 是 总是 /t:winexe /CLR /link /subsystem:windows 是 是 从不 /t:library /CLR /LD 是 否 依赖主机(Host-dependent) /t:module /CLR:NOASSEMBLY /LD 否 否 依赖主机(Host-dependent) 模块种类。如表2.1所示,有4个可能的选项。在C#和VB.NET中,通过/target命令行开关(或者其快捷形式/t)选择目标文件的种类。C++编译器可以使用多个开关的组合;不过,通过/CLR开关,强制C++编译器生成CLR兼容的模块。下面所用到的C#和VB.NET开关,将采用它们的快捷形式。 选项/t:module产生“未加工的(raw)”模块,其文件扩展名默认为.netmodule。这种格式的模块不能独立地部署,CLR也不能直接加载它们。准确地说,开发人员必须在部署前,将这些“未加工的”模块与成型的组件(被称为程序集)进行关联。相比之下,用/t:library选项编译产生的模块,能够包含附加的元数据,允许开发人员将其作为独立代码进行部署。选项/t:library编译产生的模块,其文件扩展名默认为.DLL。 用/t:library编译产生的模块能被CLR直接加载,但不能从命令外壳或Windows资源管理器中作为可执行程序启动。如果要产生可执行程序,你必须采用/t:exe或者/t:winexe选项。这两个选项均产生扩展名为.EXE的文件,唯一的差别是:前者假定为控制台UI子系统使用,后者则假定为GUI子系统。如果没有指定/t选项,默认为/t:exe。 不管是使用/t:exe还是/t:winexe选项产生的模块,都必须定义一个初始入口点(initial entry point)。初始入口点是程序启动时CLR将自动执行的方法。程序员必须将这个方法声明为static,并且,在C#或VB.NET中,还必须命名为Main。程序员能够将入口点方法声明为无返回值,或者返回int型值。他们也可以将其声明为无参数形式,或者接受一个字符串数组的参数,它包含从外壳程序输入的命令行参数。下面是C#中M

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档