随笔分类 - .NET MSIL
摘要:返回目录 小结 既然你已经了解元数据原则上是如何被组织的,你要准备好检测这些特定的元数据项和表示它们的表。所有进一步的考虑都将集中在4个元数据流上——#Strings、#Blob、#US和#~——因为#GUID只在一个元数据表中被引用到(Module表),而#-流(未优化的元数据)则从来不会被ILAsm编译器发布。 这里对一些人有一些建议,他们想知道这是否一个好的主意——在细微操作元数据的借口...
阅读全文
摘要:返回目录 元数据和验证 然而,这个“好的暗示”,仅仅是一个暗示。在前述的部分提供了关于你可以从一个列的确定的类型引用哪些表的信息。这并不意味着你应该引用所有你能够引用的表。在表5-10中列出的一些群组的符号类型比在CLR现有的发布版本中实际上可接受的要更加广阔。例如,MemberRefParent群组,描述了能够包含MemberRef记录的父级别的表,包括TypeDef表。但是这个元数据发布A...
阅读全文
摘要:返回目录 RID和符号 记录的索引和符号,是无符号整数值,用于索引元数据表中的记录。RID是简单的索引,只适用于显示指定的表,而符号则携带了识别它们所引用的元数据表的信息。 RID RID是一个识别符,是一个在包括了记录的表中从1开始的行号。有效的RID的范围从1延展到地址表中的记录的数量,1和这个数量值也包括在内。RID只用于元数据的内部;元数据发布和API重...
阅读全文
摘要:返回目录 堆和表 从逻辑上讲,元数据被表示为一组有名称的流,附带着每个流表示一类的数据。这些流被分为两种类型:元数据堆和元数据表。 String堆:这种类型的堆包括了0休止符字符的字符串,以UTF-8格式编码。这些字符串直接首尾相接。这个堆的第一个字节总是为0,而且这导致了堆中的第一个字符串总是为空字符串的结果。这个堆的最后一个字节也必须是0(换句话说,堆中的最后一个字符串,就像其它的一样,必...
阅读全文
摘要:返回目录 本章对元数据及其构造方式进行了概述。也还描述了元数据验证。后面的章节将会分析单独的元数据项——基于这里所表示的基础。我理解你可能的急躁——“这个家伙不要拖延时间,什么时候才能进入正题?”——但是我仍然奉劝你不要跳过本章。远远不是拖时,我只是系统地接近这个对象。这看上去可能是一样的,但是动机是完全不同的,而这正是我所关心的。 什么是元数据? 元数据的定义:描述数据的数据。然而,就像...
阅读全文
摘要:《Expert .NET 2.0 IL Assembler》第4章第一节第一部分,介绍了COFF头。
阅读全文
摘要:讨论过托管图像文件的结构以及IL编译器生成这些文件的方式,我将小结一下IL编译器创建一个托管PE文件的步骤。PE文件的创建表现为以下4个步骤: 步骤1:初始化 1. 初始化内部缓冲器 2. 在内存创建一个PE文件的空模板,包括MS-DOS头和stub、PE签名、COFF头和PE头。 3. 输入地址表和CLR头被分配在.text区域中。 步骤2:源代...
阅读全文
摘要:返回目录 PE头 PE头,紧跟在COFF头的后面,提供了OS加载器的信息。虽然这个头被称为可选择的头(optional header),它只是可选择的,在某种意义上是说,对象文件通常不包括它。对于PE文件而言,这个头是强制性的。 PE文件的大小是不固定的。它取决于定义在头中的数据目录的数量,并由COFF头中的SizeOfOptionalHeader字段详细指明。定义...
阅读全文
摘要:返回目录 不要忘记本章讨论的特性只在ILAsm 2.0中受到支持。 前三章确实有助于一个快速的开始。我答应过你以轻骑兵的速度冲入敌人的阵营,而你已经恰好达到了目的。到目前为止,你应该能够大体上理解IL反编译器生成的文本输出。我也希望你能对更加细节和系统的讨论感兴趣,如在CLR内部发生了什么以及如何在ILAsm中描述它。 从现在开始,下面的内容都是关于细节的和系统的...
阅读全文
摘要:《Expert .NET 2.0 IL Assembler》第3章,这一章是讲一些杂七杂八的技术。
阅读全文
摘要:《Expert .NET 2.0 IL Assembler》第2章第2节,这一节是讲IL代码保护:try...catch。
阅读全文
摘要:返回目录 现在你知道了如何写出更简洁的IL代码和如何使用托管异常处理机制来保护代码免于崩溃。 托管异常处理在.NET编程中是非常重要的,因为.NET Framework类库的托管方法会例行公事地抛出异常而不是返回错误代码。 在下一章,我将为你展示如何使IL编程减少一点乏味。
阅读全文
摘要:《Expert .NET 2.0 IL Assembler》第2章第1节,这一节是讲IL代码压缩的。
阅读全文
摘要:《Expert .NET 2.0 IL Assembler》第1章第3节,这一节是讲1.x版本的。
阅读全文
摘要:返回目录 这一章简单接触了CLR和ILAsm中的最重要特性。现在你(大体上)知道了如何写一个运行时方法和如何用ILAsm写一个程序,以及如何定义基本的组件(类,字段和方法)。你认识到托管代码可以和非托管(本地)代码互操作以及CLR如何促进这种互操作的。 在下一章,你将会继续工作在这个简单的OddOrEven示例,从而了解关于运行时和ILAsm的一些高级特性。
阅读全文
摘要:作为第1章第2节简单示例的第三部分,讨论了全局项、映射字段、数据声明和作为占位符的值类型——这四个基本概念。
阅读全文
摘要:1.Because all the classes declared within a module are by definition declared within the lexical scope of the module, it is only logical that the relationship between the module and the classes declar...
阅读全文
摘要:作为第1章第2节简单示例的第二部分,讨论了字段声明和方法声明两个基本概念。
阅读全文
摘要:作为第1章第2节简单示例的第一部分,讨论了程序头和类声明两个基本概念。
阅读全文
摘要:《Expert .NET 2.0 IL Assembler》第1章第1节,此节概念偏多,话说,一般书的开头都是如此这般讲概念。
阅读全文