内容简介本书是畅销书作家Joe Duffy精心打造的优秀图书,详细探讨了.NET Framework和CLR 2.0技术,以及如何在这个平台上编写优秀的代码。本书在介绍技术的同时还揭示了技术后面的基本原理,在解释重要概念的同时还说明了它们与其他技术的联系和相互间的对应关系。本书可帮助读者快速掌握使用.NET Framework和CLR编程。
2002年1月14日,我还是一名Java开发人员。当时我对Windows没有太多好感,主要是因为在那之前的几年我被COM和Win32惹恼了太多次。那时我不喜欢使用HANDLES、WinDbg,以及free和delete。20世纪90年代中晚期,我曾花费几年时间使用微软工具和技术进行软件开发,但最终对所开发出来的极其复杂的、堪称 “生态系统”的产品感到厌烦。虽然那时Java也还没有成熟,但它已经提供了某些功能,如沙箱状的执行环境、简单(不使用指针!)的语法和垃圾收集器等。它精心设计的库使喜欢使用纯粹的面向对象程序设计的人们感到非常方便(其实我就是其中的一员)。 但仿佛一夜之间,我再次成为Windows开发人员。我再次开始喜爱上这个平台。这段时间除了是我个人的重大转折点外,也反映出整个业界范围的转折点。几年之后再回过头想一下,可以清楚地看出,该转折点将Windows平台上的编程模型一下子带回到主流软件开发的最前端。哪些因素促成了这次革命性的方向转移?答案很简单:.NET Framework、C#语言,以及两者的基础—— 公共语言运行库(Common Language Runtime,CLR),它们都于1月15日在MSDN上发布并提供下载。 当前,这一平台已经历3次大的提升,市场上已经有了1.0、1.1版本,现在是2.0版本。技术不断地走向成熟,越来越健壮、可靠,并已经跨过了与创新性的(同时也是危险的)新技术竞争的阶段。是的,我必须承认:我青睐CLR。 本书目标 本书的首要目标是使您喜欢.NET Framework和CLR 2.0技术,并鼓励您在这个平台上编写优秀的代码。由用户编写的卓越的应用程序和库即使不比平台自身更重要,至少也是同等重要。假如因为我在这本书里写的某些内容而激发您在CLR上编写下一个,并随后因此而变得富有,那么我的工作就做到位了。 当然,大多数人需要一本合适的书还是为了实际目的(例如为了更好从事他们的工作),所以这也是本书的目标之一。这本书应该成为一本出色的基础读物,帮助您迅速了解2.0版本提供的功能,在很短的时间内从对该平台一无所知到有基本的了解,并作为需要帮助时的一本参考书。我还相信本书将成为您深入钻研自己感兴趣的特定技术领域的很好的起点。 这本书中讲述的很多主题与它们的实际内容比起来要浅显得多。这是比较合理的。我已经在书中介绍了很多有关运行时和库的最重要的内容,但肯定的是至少省略了其中一个方面,因为要想完全覆盖所有内容将给这本书增加大约10 000页的文字。为节省读者的时间,减轻阅读这么多文字的负担,我优先列出了一部分主题,并将集中讨论这些主题,我认为这些主题对以下3个目标而言是最重要的:(1)在该平台上迅速提高开发能力;(2)对体系结构有持久和基本的理解;(3)提供实际可行的建议以避免常见的错误并能在当前应用开发中编写优秀的代码。 写作初衷 当有了写作这本书的机会时,我进行了长时间的、艰难的思考才决定接受这一任务。我试图搞清楚怎样才能将这本书与其他已经出版的、讲述同样主题的书区别开来。然而不久我就意识到:我甚至连一本市场上销售的有关.NET Framework的书都没有读过,而我还自认为是这方面的专家。 总结之后我认为,我之所以没有阅读任何一本有关.NET Framework的其他书籍,其主要原因在于我非常不欣赏大部分这类书籍所涉及的内容层次和采用的写作风格。大多数作者选择了一种与产品附带的软件开发工具包(Software Development Kit,SDK)文档非常类似的方式来写作.NET Framework,即采用一种过于初级和入门化的风格。显然,阅读产品文档有助于人们理解一些面上的东西,但我想要了解得更多。毕竟文档是免费的! 如果我要写这本书,那么它必须是我自己也喜欢阅读的一本书。我认为要达到这一目标,必须满足以下几个条件: ● 不仅介绍技术“是什么”,还要说明隐藏在技术后面的“基本原理”和“采用它的原因”。这意味着要深入讨论有助于深刻了解某个主题的内部工作机制,并且甚至可以否定明显不成熟的设计决策。阅读一本仅仅描述一个平台提供什么样功能的书不仅枯燥无味,而且会使人立刻将这本书降格为查考资料类图书。 ● 解释重要概念的同时必须说明它们与其他技术的联系和相互间的对应关系。.NET Framework和CLR并非该领域的第一个平台,忽视前人的工作就好像是亵渎读者。我假定本书的读者已经懂得如何编程,因此将某项技术与读者可能熟悉的其他已有平台进行对比说明,对解释该项技术有所帮助。即使读者对相关技术并不熟悉,了解某些(疯狂)想法并非第一次实现往往是一件好事。 ● 尽可能覆盖全面,但也不隐瞒不完整的地方。在不得不简略进行介绍的地方,读者可以根据自己的时间利用指向相关资源的链接进行更为深入的学习。显而易见的是,没有一个作者可以在少于10 000页的篇幅里,以任何适当的细节程度介绍.NET Framework或是CLR的每个组成部分。与其自认为已很好地做到这一点,不如给读者留下自己进行深入研究的线索,使他们能够按照自己的计划或在必要时继续深入研究。 心里有了这些指导方针后,我接受了这个任务,并进行了为期一年的探索。这的确是一段有趣的旅程。现在重新阅读过去一年里写下的内容,我感到在上述所有方面都做得相当好。我希望读者认同我的观点。 使用本书的前提 要开始使用托管代码进行开发,所需要的就是.NET Framework软件开发工具包(SDK)。这个开发包可从MSDN站点上免费获取。下载包是可以再发布的,除了基本工具和编译器外还包括CLR及.NET Framework库。很多开发人员将会选用Visual Studio 2005来替代基于SDK的简单命令行式开发环境。同样可在MSDN 站点 上找到有关Visual Studio的信息。 本书主要内容 本书共分4个部分,下面会进一步介绍这些内容。除了4个部分之外,还有一个单独的附录,该附录描述了公共中间语言(Common Intermediate Language,CIL)的完整指令集。 第Ⅰ部分:CLR基础 本部分的目标是要了解CLR在执行托管代码中扮演的角色。从某种角度来看,是从基础开始并逐步加深学习。有些人也许宁愿略过本部分直接跳到第Ⅱ部分,在学习运行库基本概念之前先了解库。本部分将讨论这样一些话题,如通用类型系统(Common Type System,CTS)为程序提供什么样的抽象,CLR如何在一台物理机器上运行托管代码,以及它运行代码时使用的垃圾收集和实时编译等服务。 1. 第1章:引言 第1章介绍了.NET Framework技术,并阐述了2.0版本的关键改进之处。 2. 第2章:通用类型系统 在第2章中将逐一介绍通用类型系统(CTS)提供的功能。具体而言,将说明类型和它们的组件是如何组织的,值和引用类型之间的区别,以及类型系统的一些交叉特性,例如泛型和验证。读者将会了解CLR类型系统提供了哪些特性,以及像C#和VB这样的语言如何利用上述的特性。 3. 第3章:CLR技术内幕 在本章中将花费较大的篇幅介绍CLR如何完成其任务的内部细节。在概念层次上,将会使您了解托管代码能够按照正确的方式执行的原因。还将介绍C#、Visual Basic (VB)和其他托管语言编译成的中间语言(Intermediate Language,IL)、异常子系统以及运行库管理内存的方式。本章的最后讲解CLR的JIT编译器。 4. 第4章:程序集、加载和部署 本章将介绍CLR的部署单元和程序集,它们包含的内容,以及编译器是如何生成它们,运行库是如何加载它们的。还将说明可用于部署的一些可选项,例如共享库、私有库和ClickOnce。 第Ⅱ部分:基础架构库 在第Ⅰ部分介绍了运行库自身的功能后,本书的下一部分将讨论基类库(Base Class Libraries,BCL)的特定部分。记住,这些是编写托管代码时将用到的Windows API。将仅讨论托管程序中最常见和最重要的一些库,而在本书后面的章节中学习其他一些更高级的库。 1. 第5章:基本类型 本章将介绍Framework必须提供的最底层的基本类型。除了在几乎所有的程序中都将使用的一些类似的通用类型外,这些类型包括构建到语言和运行库自身的基本类型。具体而言,包括标量、字符串、日期和时间、数学、常用的实用程序和常见的异常类型。. 2. 第6章:数组和集合 几乎所有的程序要用到数据集合。System.Collections.Generic API提供了一种完成此任务的完善的方法,充分利用了泛型的功能。本章将说明除了一些非常基本的集合外这些API将提供的集合类型,包括普通的System.Collections类型和数组。 3. 第7章:I/O、文件和联网技术 到这个时候,应该非常习惯于创建和使用本地CLR数据。但是只对基本类型,如字符串、日期等,进行运算的程序非常少。本章将说明如何通过使用I/O与外部世界进行交互,包括使用文件系统和通过网络类库(Network Class Libraries,NCL)进行通信。 4. 第8章:国际化 在当今全球化世界中一个日益重要的主题是国际化(i18n),也就是使应用程序适合地区文化和语言的过程。.NET Framework上i18n的中坚是文化和资源,这正是本章的基本主题。将讨论应用程序国际化需要面对的一些技术性和非技术性挑战。 第Ⅲ部分:CLR高级服务 本书的第Ⅲ部分将介绍CLR必须提供的一些高级服务,这些服务包括安全的编程模型、隔离和并发的形式以及CLR必须提供的各种互操作性特性。尽管这里讨论的许多主题是CLR标记的特性,利用库的程序员将会用到几乎所有这些特性。 1. 第9章:安全性 CLR提供了一种安全基础设施,可以根据用户和代码标识来批准特权的操作。代码访问安全性(CAS)允许根据代码的来源限制程序的操作权限,例如代码是源自Internet、内联网还是本地机器,此外还可使用其他有意义的标准来确定安全权限。 2. 第10章:线程、AppDomain(应用域)和进程 本章将会介绍CLR必须提供的各种隔离和执行粒度。还会说明Framework中的并发编程模型,例如如何创建、同步和控制并行操作。另外,还会介绍可以用来控制AppDomain和进程的各种技术。 3. 第11章:非托管互操作性 并非所有的代码都是托管代码。实际上,大量的Windows代码都是用C、C++和COM编写的,并且很可能在今后的一段时间仍是如此。CLR提供了将类型系统、托管代码的二进制格式和这些技术联系在一起的方法。此外,当和非托管代码互操作使用时,它要求超越简单的内存管理的界限。因此,需要额外的技术来确保以可靠的方式释放资源。 第Ⅳ部分:高级Framework库 在本书的第Ⅳ部分中,介绍一些更高级的Framework API,它们尽管没有第Ⅱ部分中介绍的那些API常用,但是在托管代码中也会常常用到。 1. 第12章:跟踪和诊断 CLR和相关的工具,如Visual Studio集成开发环境(IDE),提供了强大的调试功能。但是除此之外,使程序和库配备跟踪代码有助于测试和故障分析。另外,跟踪还允许诊断代码中非常细微的问题,如因果关系、性能和可靠性问题。本章将较为全面地说明Framework中的跟踪基础设施。. 2. 第13章:正则表达式 本章将对正则表达式进行概括性的介绍—— 除了System.Text.RegularExpressions命名空间中的.NET Framework API外,还会介绍正则表达式的特性、语法和功能。通过本章的讲解,用户应该能够将正则表达式合理地集成到应用程序中。 3. 第14章:动态编程 在第Ⅱ部分中说明了元数据如何增强CLR和.NET Framework的功能。第14章将介绍如何在动态编程场合中利用这些元数据。这意味着基于元数据驱动的功能呈现在结合了运行时信息的程序中,而不仅仅是编译时已知的信息。这将涉及到使用Reflection(反射)子系统。 除此之外,还将说明如何使用System.Reflection.Emit命名空间来生成元数据。 4. 第15章:事务 自Framework的2.0版本起,添加了一个新的统一事务的API。这将ADO.NET、消息传递和Enterprise Services (COM+)事务集成在一个单独的紧密联系的保护系统中。System.Transactions提供了一组非常简单的类型并支持本地和分布式事务。 5. 附录 附录中列出了CIL和MSIL指令集中全部的IL指令。 源代码 在您登录到Wrox站点/时,只需使用Search工具或使用书名列表就可以找到本书。接着在Code栏中单击Download链接,或单击本书信息页面上的Download Code链接,就可以获得本书所有的源代码。另外,您也可以从本书的合作站点www.tupwk.com. Cn/downpage上下载本书的所有源代码。 从以上站点上下载的文件使用WinZip进行了压缩。在把文件保存到硬盘的一个文件夹中时,需要使用解压缩软件(如WinZip或PKUnzip)对该文件解压缩。在解压缩时,代码常常放在各自的章节文件夹中。在开始解压缩过程时,一定要将解压缩软件WinZip或PKUnzip设置为使用文件夹名。 勘误表 尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果您在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。请给wkservice@tup.tsinghua.edu.cn发电子邮件,我们就会检查您的信息,如果是正确的,就把它发送到该书的勘误表页面上,或在本书的后续版本中采用。 要在网站上找到勘误表,可以登录,通过Advanced Search工具或书名列表查找本书,然后在本书的信息页面上,单击Book Errata链接。 E-Mail支持 如果您希望直接就本书的问题向对本书知之甚多的专家咨询,那么,就向support@wrox. Com发电子邮件,在电子邮件的“主题”(Subject)栏中,加上本书的名称和ISBN的最后4位号码。典型的电子邮件应该包括下列内容: ● 在“主题”栏加上英文书的书名、ISBN的最后4位数字(1354)和问题所在的页码。 ● 在邮件的正文中加上您的姓名、联系信息和问题。 我们不会发给您垃圾邮件。我们只需要详细的情况以节省您的宝贵时间和我们的时间。当您发送电子邮件时,它会直接链接到以下支持链: ● 客户支持—— 您的消息会传送到我们的客户支持人员,他们是阅读信息的第一人。他们有常见问题的文件,会迅速回答一般性的问题。他们回答关于本书和网站的一般性问题。 ● 编辑支持—— 更深的问题会转发到负责本书的技术编辑处。他(或)她具有编程或特殊产品的经验,能够回答某个主题的详细技术问题。 ● 作者支持—— 最后,在编辑都不能回答问题的情况下(这种情况很少出现),这些问题将转发到作者。我们试图保护作者不要从写作中分心,但是,我们也很愿意将特殊的问题转发给他们。所有的Wrox作者帮助支持他们的书籍。他们向客户和编辑回复电子邮件,所有的读者都会从中受益。 Wrox支持过程只能提供直接与已出版的图书相关的问题。对于超出此范围的问题可以通过/论坛的团体列表来提供支持。 P2P邮件列表是为作者和同行的讨论而设立的。我们在邮件列表、论坛和新闻组中提供“程序员到程序员的支持”(programmer to programmer support),还包括一对一的电子邮件支持系统。如果把问题发送给P2P,就可以相信,您的问题不仅仅是由支持专家解答,而且还要提供给我们邮件列表中的许多Wrox作者和其他业界专家。在上,可以从许多不同的列表中获得帮助,不仅在阅读本书时获得帮助,还可以在开发应用程序时获得帮助。在网站的.NET类别中,最适合本书的是beginning_vb和vb_dotnet列表。 要订阅一个邮件列表,可以遵循下面的步骤: (1) 进入。 (2) 从左侧的菜单栏中选择合适的列表。 (3) 单击想加入的邮件列表。 (4) 按照指示订阅和填写电子邮件地址和密码。 (5) 回复接收到的确认电子邮件。 (6) 使用订阅管理器加入更多的列表,设置自己的邮件设置。 为什么这个系统提供最好的支持 您可加入该邮件列表中,也可以每周分类接收它们。如果您没有时间或设备接收该邮件列表,可以搜索我们的在线文档。垃圾邮件和广告邮件会被删除,您自己的电子邮件地址会被独特的Lyris系统保护起来。任何加入或退出列表的查询,或者与列表相关的一般问题,都应发送到listsupport@。