为什么要写这本书呢?
说实话,对此,我是责无旁贷的。这本书是我早期写的一本书的修订和扩展:《Inside Microsoft .NET IL Assembler》(图书上架于2002年初,在.NET CLI 1.0版本公布1个月后)。因此,时隔四年多,更加强大的.NET CLI 2.0版本公布之即,我的创作意图就非常显而易见了。而且,很多程序员所写的代码,已经涉及到.NET CLR的内部工作原理,这也是我没有其他选择而必须选择写作此书的原因。
.NET领域,与其他信息技术领域类似,如同一个巨大倒立的“金字塔”,根植于它的底层核心技术之上。.NET领域所依赖的底层是CLR。CLR将IL二进制代码转换为特定于平台(本地)机器代码并且执行这段代码。位于在CLR之上的是.NET Framework类库、编译器以及像VisualStudio这样的环境。在它们之上的才是从工具到面向终端用户的应用开发层。这个金字塔正在迅速地向上蔓延,越来越高,越来越宽。
准确的说,这本书并不是关于CLR的——虽然CLR是.NET领域这座“金字塔”的底层核心技术,但是CLR是一个庞大的主题,以至于不可能在一本书的合理范围内对其进行详细描述。本书着重讨论另一个重要的主题:.NET IL汇编语言。IL汇编语言(ILAsm)是一种低级语言,专门用于描述CLR的各种基本特性。如果CLR具有这些特性,ILAsm就必须能够对其进行解释。
ILAsm不同于高级语言而类似于其他汇编语言,它是平台驱动而非概念驱动的。一门汇编语言通常会与底层平台之间存在精确的语言映射,在目前的情况下,这个底层平台就是CLR。事实上,这是一种非常精确的映射,以至于这种语言可以用来描述ECMA/ISO标准化文档中涉及到.NET CLI的运行环境的各个方面(ILAsm本身作为CLI的一部分,也是这个标准化文档的一个主题)。由于这种紧密的映射,如果不涉及附底层平台的大量细节,也就不可能描述相应的汇编语言。所以,从某种程度上讲,这本书归根到底是关于CLR的。
IL汇编语言在.NET开发者中非常流行。我并不是说所有的.NET开发者都喜欢使用ILAsm编程,而不喜欢使用Visual C++/CLI、C#或者Visual Basic.NET。但是所有的.NET开发者都偶尔使用过ILAsm,而且许多人还会经常使用它。无论.NET开发者所偏好的语言和从事的开发领域是什么,在他们的计算机屏幕上都会有一个青色的闪电(ILDASM的图标)在闪光。而ILDASM文本的输出正是ILAsm源代码。
事实上所有基于.NET编程的书籍都专注于高级编程语言,如C#或者Visual Basic,或者是ADO.NET这样的技术,只是在有些时候会提到ILDASM,作为反汇编的可选工具,来分析.NET托管可执行程序的内部情况。但是这些书籍都没有解释这些反汇编文本的含义以及如何解释它们。对这些书籍来说,这种选择是可以理解的,因为对元数据结构和IL汇编语言的详细描述是另外一个独立的话题。
现在,读者可能已经明白我责无旁贷写作此书的意义了。因为我负责设计和开发ILAsm以及ILDASM,所以我有责任详尽地层示这些技术。
ILAsm的历史
ILAsm和ILDASM的第1版(分别名为Asm和DASM)由Jonathan Forbes在1998年初开发成功。当前的语言与它最初的形式已经有了很大的差异,它们所具有的惟一显著的公共特性就是指令关键字中的前导点号。这些汇编和反汇编工具最初是作为纯粹的内部工具而构建的,方便了正在进行的CLR开发,它们在运行环境开发小组中得到了相当广泛的使用。
在1999年初,Jonathan离开了CLR团队,而这个汇编和反汇编工具交给了Larry Sullivan,Larry所领导的开发团队有一个很有意思的名字:CROEDT(Comlnon Runtime Odds and Ends Development Team)。在那一年的4月,我加入了这个团队,IdI叮将这个汇编和反汇编工具的任务交给了我。当1999午5月CLR的alpha-版本出现在技术预览会上的时候,Asm,特别是DASM引起了人们极大的关注,同时我被告之要重新处理这个工具,将其发展到产品的水平。在Larry、Vance Morrison和Jim Miller的帮助下,我完成了这项工作。因为这些工具当时还只是内部组件,所以我们(Larry、Vance、Jim和我)从根本上对这个语言进行了重新设计——并不是只将其作为工具实现。
主要的突破发生在1999年的后半年,当时ILAsm输入和ILDASM输出已经可以实现足够的同步,进而可以获得有限的双向解析(round-tripping)。双向解析意味着用户可以编译特定语言,获得托管的(IL)可执行程序,对其进行反汇编、增加或者修改一些ILAsm代码,然后重新将其组装到经过修改的可执行程序中。双向解析技术开创了新纪元,此后不久,它就开始应用于Microsoft及其伙伴的特定产品的开发过程中。
大约在同一时期,使用ILAsm作为基本语言的第三方.NET编译器也已经开始出现。人所共知的可能就是Fujitsu的NetCOBOL,它在2000年7月的专业开发者会议上大出风头,这次会议向开发者们发布了最初的CLR的pre-beta版本并附带.NET Framework类库、编译器和工具。
自从2000年底beta 1版本发布以来,ILAsm和ILDASM的功能日渐完善,它们已经可以反映元数据和IL的所有特性,并支持完整的双向解析,而且能够将自身的改变与运行环境的改变保持同步。
ILAsm的推进
这段时间里,ILAsm越来越多的应用于编译器和工具实现、教育以及学术研究。以下这些编译器,范围覆盖从纯学术工程到“产业优势”系统,生成ILAsm代码作为输出,并让ILAsm负责产生托管的可执行体。
l Ada# (USAF Academy, Colorado)
l Alice.NET (Saarland University, Saarbrücken)
l Boo (codehaus.org)
l NetCOBOL (Fujitsu)
l COBOL2002 for .NET Framework (NEC/Hitachi)
l NetExpress COBOL (Microfocus)
l CommonLarceny.NET (Northeastern University, Boston)
l CULE.NET (CULEPlace.com)
l Component Pascal (Queensland University of Technology, Australia)
l Fortran (Lahey/Fujitsu)
l Hotdog Scheme (Northwestern University, Chicago)
l Lagoona.NET (University of California, Irvine)
l LCC (ANSI C) (Microsoft Research, Redmond)
l Mercury (University of Melbourne, Australia)
l Modula-2 (Queensland University of Technology, Australia)
l Moscow ML.NET (Royal Veterinary and Agricultural University, Denmark)
l Oberon.NET (Swiss Federal Institute of Technology, Zürich)
l S# (Smallscript.com)
l SML.NET (Microsoft Research, Cambridge, United Kingdom)
ILAsm和ILDASM协力工作的能力产生了大量有趣的工具和技术,这些都基于“创造性的双向解析”的托管可执行体:反编译——文本处理——再编译。例如,Preemptive Software(一家以面向Java和.NET混淆和代码优化而著名的公司),就在此基础上建造了自己的DotFuscator体系。DotFuscator是一款商业的、工业领域的混淆和优化系统,在市场上非常出名。我在第19章讨论了另外一些有趣的关于“创造性的双向解析”的应用程序实例。
实际上,所有.NET的学术研究在一定程度上都使用到了ILAsm(这些课程的作者还可以怎样展示.NET托管可执行体的内部呢?)。一些研究是完全基于ILAsm的,如Dr. Regeti Govindarajuluat在印度海得拉巴的国际信息技术协会;Drs. Andrey Makarov,Sergey Skorobogatov,和Andrey Chepovskiy在俄罗斯莫斯科的国立大学和包曼工业大学。
谁该阅读本书
本书面向所有.NET的开发人员,因为他们在非常高级的层次上工作,所以可能需要考虑程序的编译结果,或者希望分析所编译程序的最终结果。这些读者可以在本书中找到解释反汇编文本以及元数据结构概要的必要信息,这可以帮助他们开发出更有效率的编程技术。
因为分析反汇编信息和元数据结构对于评估任何面向.NET的编译器的正确性和效率都十分关键,所以这本书也非常适用于.NET编译器的开发者。还有一些目前数量较少但在逐渐增加的读者——将发现这本书对他们相当有帮助,包括直接使用IL汇编语言的开发者,例如,将ILAsm作为中间步骤的编译器开发人员、策划多语言项目的开发人员,以及希望提高驾驭CLR能力(这种能力无法从高级语言中获得)的开发人员。
最后,本书对于软件开发的所有阶段都很有价值,从概念设计到实现和维护。
本书的组织
第一部分“快速入门”首先基于一个简单的示例程序对ILAsm和CLR的特性进行快速的概述。这个概述并不完善;然而,它可以用来描述运行环境和作为语言的ILAsm总体情况。
接下来的部分将会使用自底向上的方式,详细讨论运行环境的特性以及相应的ILAsm结构。第二部分“底层结构”将会描述托管可执行文件的结构以及总体的元数据组织。第三部分“基本组件”,专门介绍构成应用的必备基础组件:程序集(assembly)、模块(module)、类(class)、方法(method)、字段(field)以及相关主题。第四部分“深入执行体引擎”,将会带领用户深入讨论执行体引擎,分析IL指令的执行体以及托管异常处理。第五部分“特殊组件”,将会讨论其他组件的元数据表示和使用:事件(event)、属性(property)以及自定义和安全特性。第六部分“互操作”,将会描述托管代码和非托管代码之间的互操作,并且讨论ILAsm和ILDASM在多语言项目中的实际应用。
本书的五个附录包含有关ILAsm语法、元数据组织以及IL指令集和工具特性的参考,包括ILAsm、ILDASM和离线元数据验证工具。
包包注:这篇“绪论”应该是作者基于第一版的“绪论”扩展而来,所以在“本书的组织”章节中,错误的写到“第六部分 互操作”,实际在目录中并不是这么分模块的。
几个不确定的翻译:
irective 翻译成伪指令还是指令???
industrial strength 工业力量?工业实力?我暂时翻译为"工业领域"