再读《Microsoft .NET IL汇编语言程序设计》
作者:lover_P
《Microsoft .NET IL汇编语言程序设计》(以下简称《IL》)一书中文版已经出版了一年有余了,在计算机界,这已经算是一本“老书”了。时至今日我还要提到它,是因为它对于研究.NET元数据世界秘密的贡献要远远超过对于学习IL汇编语言程序设计的贡献。
对于任何平台,我都有着非凡的好奇心——对于微软的.NET平台也不例外,因此,我早早地买回了《IL》一书。通篇浏览下来,作者除了在第一、二两章里分别讲述了两个完整的IL汇编程序之外,一直到页码过半,才在第10章中重新谈起IL指令集——然而谈过一章之后,竟又回到感念性叙述,丝毫未见“程序设计”的影子……想来那些有着汇编语言和面向对象高级语言程序设计经验的朋友才有可能通过前两章的小程序和第10章里介绍的指令学会编写高效、漂亮的IL汇编语言程序吧?看着封底上的作者简介,我不由得感叹:这位大师技术却是了得,然而作起文章来就不那么灵通了。于是,这本书被我丢进了书架的角落。
然而,我从未停止过对好奇心的满足,我开始深入到.NET元数据的内部一窥究竟。这种日子是寂寞和痛苦的,参考资料的缺乏、数据结构的错综复杂经常让我陷入困境、一筹莫展。这使得我再一次翻开了《IL》这本书。然而,呈现在我眼前的不再是零零散散的汇编语言介绍和不着边际的论述,在一阵目瞪口呆过后,我的心情惟有豁然开朗以形容!
在介绍完简单的程序之后,作者揭开了.NET托管扩展的PE文件格式的秘密——这就是.NET元数据迷宫的入口啊。之后,作者分别就基本组件、指令集、特殊组件和互操作进行了深入的解析——这一切都是围绕着元数据的逻辑架构进行的。在对构成元数据的基本结构——元数据表的讲述中,作者完全抛开了“表”的概念,而是从程序的表现上生动地分析了每个元数据表的模式以及这些模式与高级语言中的各种语法元素的映射关系——至此你已经被完完全全地带入了元数据世界的迷宫中。
因此,我不得不在这里提醒大家——这不是一本给初学者(包括初涉.NET领域的Programmer和Coder)或者.NET应用开发者准备的书。只有当你对于.NET架构有着特别的神秘感和兴趣、并且有着“不畏牺牲”的探索精神时,或者你确实需要开发能够生成.NET可执行程序的应用软件时,这本书才是你的案头必备之物。
阅读建议
首先,如上面所说的,在你阅读这本书之前请先确定你确实需要这本书。
其次,这本书直击.NET元数据的底层,对于整个.NET平台的全貌和元数据的整体逻辑构成没有详细地介绍(甚至是没有介绍),因此,读者朋友需要先行通过阅读其他书籍了解.NET平台的架构以及运行时环境的基本机制;并且对元数据中的流(Stream)、堆(Heap)和表(Table)有概念性的了解。
然而,这本书偏偏又不是一本参考手册,因此,如果你希望彻底地了解.NET元数据架构并构建能够生成.NET可执行程序的应用,在本书之外还需要参考一些标准文档。然而确实可供参考的标准恐怕也只有这一个了:
ECMA-335: Common Language Infrastructure
最后,切记不要把这本书当作一本学习.NET IL汇编语言程序设计的教材。
缺陷和遗憾
不知是因为作者或出版社不小心,还是因为微软不希望它未来十年所赖以生存的底层技术为他人所理解,这本书出现了不小的缺陷——在附录B中给出的元数据表中,对于下列表的编号是完全错误的:
表 | 编号(十进制) |
ENCLog | 28 |
ImplMap | 29 |
ENCMap | 30 |
FieldRVA | 31 |
ECMA标准中给出的正确编号是这样的:
表 | 编号(十进制) |
ImplMap | 28 |
FieldRVA | 29 |
ENCLog | 30 |
ENCMap | 31 |
最初我也只是发现本书中的这些内容和标准冲突,再通过Vijay Mukhi的Metadata Tables一书中介绍的程序验证之后,我发现确实是书中出错了……这不能不说是这本书最大的遗憾。
最后,与其他书评不同,我不敢妄推这本书给任何人。请务必首先确定你需要这本书!!!
[回顶端]