第一章 CLR的执行模型

第一章 CLR的执行模型 本章内容: 将源代码编译成托管模块 将托管模块合并成程序集 加载公共语言运行时 执行程序集的代码 本机代码生成器:NGen.exe Framework类库入门 通用类型系统 公共语言规范(CLS) 与非托管代码的互操作性 Microsoft .NET Framework引入许多新概念、技术和术语。本章概述了.NET Framework如何设计,介绍了Framework包含的一些新技术,并定义了今后要用到的许多术语。还要展示如何将源代码生成为一个应用程序,或者生成为一组可重新分发的组件(文件)——这些组件(文件)中包含类型(类和结构等)。最后,本章解释了应用程序如何执行。 1.1 将源代码编译成托管模块 决定将.NET Framework作为自己的开发平台之后,第一步便是决定要生成什么类型的应用程序或组件。假定你已完成了这个小细节;一切均已合计好,规范已经写好,可以着手开发了。 现在,必须决定要使用哪一种编程语言。这通常是一个艰难的抉择,因为不同的语言各有长处。例如,非托管C/C++可对系统进行低级控制。可完全按自己的想法管理内存,必要时能方便地创建线程。另一方面,使用Microsoft Visual Basic 6.0可以快速生成UI应用程序,并可以方便地控制COM对象和数据库。 顾名思义,**公共语言运行时(Common Language Runtime,CLR)**是一个可由多种编程语言使用的“运行时”。CLR的核心功能(比如内存管理、程序集加载、安全性、异常处理和线程同步)可由面向CLR的所有语言使用。例如,“运行时”使用异常来报告错误;因此,面向它的任何语言都能通过异常来报告错误。另外,“运行时”允许创建线程,所以面向它的任何语言都能创建线程。 CLR 早期文档中翻译为“公共语言运行库”,但“库”一词很容易让人误解,所以本书翻译为“公共语言运行时”,或简称为“运行时”。为了和“程序运行的时候”区分,“运行时”在作为名词时会添加引号。 ——译注 事实上,在运行时,CLR根本不关心开发人员用哪一种语言写源代码。这意味着在选择编程语言时,应选择最容易表达自己意图的语言。可用任何编程语言开发代码,只要编译器是面向CLR的。 既然如此,不同编程语言的优势何在呢?事实上,可将编译器视为语法检查器和“正确代码”分析器。它们检测源代码,确定你写的一切都有意义,并输出对你的意图进行描述的代码。不同编程语言允许用不同的语法来开发。不要低估这个选择的价值。例如,对于数学和金融应用程序,使用APL语法来表达自己的意图,相较于使用Perl语法来表达同样的意图,可以节省许多开发时间。 Microsoft 创建好了几个面向“运行时”的语言编译器,其中包括:C++/CLI、C#(发音是“C sharp”)、Visual Basic、F#(发音是“F sharp”)、Iron Python、Iron Ruby以及一个“中间语言”(Intermediate Language,IL)汇编器。除了Microsoft,另一些公司、学院和大学也创建了自己的编译器,也能面向CLR生成代码。我所知道的有针对下列语言的编译器:Ada,APL,Caml,COBOL,Eiffel,Forth,Fortran,Haskell,Lexico,LISP,LOGO,Lua,Mercury,ML,Mondrian,Oberon,Pascal,Perl,PHP,Prolog, RPG,Scheme,Smalltalk和Tcl/Tk. 图1-1展示了编译源代码文件的过程。如图所示,可用支持CLR的任何语言创建源代码文件,然后用对应的编译器检查语法和分析源代码。无论选择哪个编译器,结果都是托管模块(managed module)。托管模块是标准的32位Microsoft Windows可移植执行体(PE32)文件,它们都需要CLR才能执行。顺便说一句,托管程序集总是利用Windows的数据执行保护(Data Execution Prevention,DEP)和地址空间布局随机化(Address Space Layout Randomization,ASLR),这两个功能旨在增强整个系统的安全性。 PE 是Portable Executable(可移植执行体)的简称。 图1-1 将源代码编译成托管模块 表1-1总结了托管模块的各个组成部分。 表1-1 托管模块的各个部分 组成部分 说明 PE32或PE32+头 标准Windows PE文件头,类似于“公共对象文件格式”(Common Object File Format,COFF)头。如果这个头使用PE32格式,文件能在Windows的32位或64位版本上运行。如果这个头使用PE32+格式,文件只能在Windows的64位版本上运行。这个头还表示了文件类型,包括GUI,CUI或者DLL,并包含一个时间标记来指出文件的生成时间。对于只包含IL代码的模块,PE32(+)头的大多数信息会被忽视。如果是包含本机(native)CPU代码的模块,这个头包含与本机CPU代码有关的信息 CLR头 包含使这个模块成为托管模块的信息(可由CLR和一些实用程序进行解释)。头中包含要求的CLR版本,一些标志(flag),托管模块入口方法(Main方法)的MethodDef元数据token以及模块的元数据、资源、强名称、一些标志及其他不太重要的数据项的位置/大小 元数据 每个托管模块都包含元数据表。主要有两种表:一种表描述源代码中定义的类型和成员,另一种描述源代码引用的类型和成员 IL(中间语言)代码 编译器编译源代码时生成的代码。在运行时,CLR将IL编译成本机CPU指令 本机代码编译器(native code compilers)生成的是面向特定CPU架构(比如x86,x64或ARM)的代码。相反,每个面向CLR的编译器生成的都是IL(中间语言)代码。(本章稍后会详细讨论IL代码。)IL代码有时称为托管代码(managed code),因为CLR管理它的执行。...

2024-11-20 · 8 分钟 · SAM

序言

序言 大家好,我们又见面了。谁预见到了今天啊?哈哈,我就预见到了!一旦步入步入婚姻的殿堂,就相当于过上了“土拨鼠日”。如果还没有看过那部电影,就去看看吧。看了之后,就会明白为什么自己老是犯同样的错误。当Jeff说他不再写书的时候,我就知道这是一个“瘾君子”开的空头支票。Jeff不可能停止写书。就在今天,我们还在说起他“绝对”不可能写的另一本书呢(实际情况是,有一章已经在写了)。写书已深入到他骨子里面去了。千里马生来就是要奔跑的,Jeff生来就是要写作的。 Jeff太有规律了。他就是离不开硬盘里那些小小的0和1。忽视它们是不可能的。凌晨3点,我们睡梦正酣的时候,Jeff的生物钟就在催促他起床了(巧合的是,我们4岁大的小儿子也恰好在这个时候爬到我们的床上。爷儿俩的行为模式我都理解不了啊)。一股神秘的力量促使Jeff的大脑自动释放出解决方案、头脑风暴和臭虫之类的东西,迫使他跑到办公室把这些问题——就像一个神秘的网络超级英雄,防止线程又成为薄弱环节。[^saving the thread from becoming just another loose end,直译就是“防止线头儿又松了”] 但积累这些知识供自己使用,这对Jeff来说远远不够。好东西不该独享。所以必须把它们传播开来,必须把它们写下来。知识像电波,有心人能接收得到。这就是他为你所做的,亲爱的读者,是他热爱微软技术的证明。 本书还有另一层意义在里面。Jeff每次绕着太阳“公转”一圈,都会变得更老一些。经过多年的积累,他也学着“向后看”了。由于看事情的方式变得更成熟,所以他重写了讲反射的那一章。或许你也应该跟他一起回顾一下这个主题。可以学到怎样让代码自个儿询问关于代码的事儿,进而更深入地思考为什么反射要那样工作。穿上便服,找一把舒服的皮椅子坐下,花些时间想想自己的代码以及它们生命中更深层次的意义。 本书还讲了一样有趣的东西,就是异步/等待[^ async和await是C#的两个关键字,允许用顺序编程模型执行异步操作]。和我老公以前鼓捣过一阵子的AsyncEnumerator相比,这个东西显然进步了不少。哎,我还以为今后离不开它了呢!事实上,虽然他跟我讲了好多次AsyncEnumerator,但这个东西根本就没有在我的脑子里“阻塞”嘛!于是我窃想,如果知道什么是enumerator是人口普查员的意思。这一章难道是讲人口普查员怎样协调工作的事儿?太浪费纳税人的钱了吧!不过,我相信它在计算机里面的意义比我查到的好。Jeff和微软的团队一起工作,将异步/等待打磨得很完美。你现在通过这本书就能舒舒服服地享受他们的成果了。我建议你好好读一下。嗯,要顺着读。[^Kristin 用“sequentially”一词来吐槽顺序编程模型] 本书的另一个重头戏是我感觉最兴奋的。希望你们都来看看关于WinRT的内容。这个术语太书呆子气了,我的理解就是“马上为我无敌帅气的平板搞一些很酷的应用出来!”你猜得没错,新的Windows Runtime就是围绕无敌帅气的触摸屏展开的。孩子喜欢小鸟飞向小猪,我则喜欢跟鲜花有关的东西,而你完全可以用平板做其他事情。没有做不到,只有想不到!去折腾出一些“奇思妙想非常牛掰”(Wondderful Innovative Nifty Really Touchy,WinRT)的东西出来。就当是为了我,好好看看这一章。否则的话,我对Jeff和他无休止的写作事业可能真的会失去耐心,会把他关到一间只有枕头线脑[^Kristin 又在吐槽“thread”了。]而且没有电的小黑屋里面。你们程序员看着办吧,是用WinRT写一些很酷的应用,还是再也没有Jeff的新书看! 总之,在你们的力挺之下,Jeff的又一部大作诞生了。我们的家庭貌似又可以回归正常状态了。但真的正常吗?或许他不停写书才是真的正常吧。 让我们耐心等待下一本书的神秘召唤。 Kristin Trace(Jeffrey的妻子) 2012 年 10 月 土拨鼠日这个电影我看了,重复的过着一天的生活,虽然是循环,但是主角也在慢慢的改变,也在做自己的努力去改变这个循环,结局是美好的,可能有些人会希望像男主人公一样,循环往复吧。 看看人家的老婆写的序,是不是有些羡慕,真好,真香。好好过好每一天吧,无论快乐和不快乐,逝者如斯夫,不舍昼夜,懂得珍惜当前,眼前人,手中事,做到无愧于心。

2024-11-20 · 1 分钟 · SAM

前言

前言 1999年10月,Microsoft的一些人首次向我展示了Microsoft .NET Framework、公共语言运行时(CLR)和C#编程语言。看到这一切时,我惊呆了,我知道我写软件的方式要发生非常大的变化了。他们请我为团队做一些顾问工作,我当即同意了。刚开始,我以为.NET Framework 是 Win32 API 和 COM 上的一个抽象层。但随着我投入越来越多的时间研究,我意思到它是一个更宏伟的项目。某种程度上,它是自己的操作系统。有自己的内存管理器,自己的安全系统,自己的文件加载器,自己的错误处理机制,自己的应用程序隔离边界(AppDomain)、自己的线程处理模型等。本书解释了所有这些主题,帮你为这个平台高效地设计和实现应用程序和组件。 我写这本书是2012年10月,距离首次接触.NET Framework 和 C#正好13年。13年来,我以Microsoft顾问身份开发过各式各样的应用程序,为.NET Framework本身也贡献良多。作为我自己公司Wintellect的合伙人,我还要为大量客户工作,帮他们设计、调试、优化软件以及解决使用.NET Framework进行高效率编程。贯穿本书所有主题,你都会看到我的经验之谈。 本书面向的读者 本书旨在解释如何为.NET Framework开发应用程序和可重用的类。具体地说,我要解释CLR的工作原理及其提供的功能,还要讨论Framework Class Libarary(FCL)的各个部分。没有一本书能完整地解释FCL——其中含有数以千计的类型,而且这个数字正在以惊人速度增长。所以,我准备将重点放在每个开发人员都需要注意的核心类型上面。另外,虽然不会专门讲Windows窗体、Windows Presentation Foundation(WPF)、Microsoft Silverlight、XML Web服务、Web窗体、Microsoft ASP.NET MVC、Windows Store应用等,但本书描述的技术适用于所有这些应用程序类型。 本书围绕Microsoft Visual Studio 2012/2013,.NET Framework 4.5.x 和 C# 5.0 展开。由于Microsoft在发布这些技术的新版本时,会试图保持很大程度的向后兼容性,所以本书描述的许多内容也适合之前的版本。所有示例代码都用C#编程语言写成。但由于CLR可由许多编程语言使用,所以本书内容也适合非C#程序员。 注意 本书代码可从Wintellect网站下载:http://wintellect.com/Resource-CLR-Via-CSharp-Fourth-Edition,也可从译者博客下载:http://transbot.blog.163.com. 我和我的编辑进行了艰苦卓绝的工作,试图为你提供最准确、最新、最深入、最容易阅读和理解、没有错误的信息。但是,即便有如此完美的团队协作,疏漏和错误也在所难免。如果你发现了本书的任何错误或者想提出一些建设性的意见,请发送邮件到JeffreyR@Wintellect.com 致谢 没有别人的帮助和技术援助,我是不可能写好这本书的。尤其要感谢我的家人。写好一本书所投入的时间和精力无法衡量。我只知道,没有我的妻子Kristin和两个儿子Aidan和Grant的支持,根本不可能有这本书的面世。多少次想花些时间一家人小聚,都因为本书而放弃。现在,本书总算告一段落,终于有时间做自己喜欢做的事情了。 本书的修订得到了一些“高人”的协助。.NET Framework团体队的一些人(其中许多都是我的朋友)审阅了其中的章节,我和他们进行了许多发人深省的对话。Christophe Nasarre 参与了我几本书的出版,在审阅本书并确保我能以最恰当的方式来表达的过程中,表现出了非凡的才能。他对本书的品质有至关重要的影响。和往常一样,我和Microsoft Press的团体进行了令人愉快的合作。特别感谢Ben Ryan,Devon Musgrave和Carol Dillingham。另外,感谢Susie Carr和Candace Sinclair提供的编辑和制作支持。 勘误和支持 我们尽最大努力保证本书的准确性。勘误或更改会添加到以下网页: http://www.oreilly.com/catalog/errata.csp?isbn=0790145353665 http://go.microsoft.com/FWLink/?Linkid=266601 如果发现未列出的错误,可通过相同的网页报告。 如需其他支持,请致函Microsoft Press Book Support部门: mspinput@microsoft.com 注意,上述邮件地址不提供产品支持。 最后,本书中文版的支持(勘误和资源下载)请访问译者博客: http://transbot.blog.163.com 因为……所以…… 保持好奇心 坚持本心

2024-11-20 · 1 分钟 · SAM