今天非常快速的看完全部章节,感觉对IL已经有了一个非常轮廓的了解,知道如果碰到问题了,需要怎么查阅本书。
大致看了一遍,1-3章略微介绍了一些IL片段,让人有些基本认识。
4-16章分别介绍了一些专门的知识,分类如下
文件格式:
第4章:介绍基于CRL的可执行文件结构
第5章:元数据表相关结构,这里所有函数都有
高级程序语言里的概念所对应的IL语法相关,本章开始,涉及到IL的语法规范了,如果想独立写出IL,应该从此章开始认真学习:
第6章:模块和程序集
第7章:命名空间和类
第8章:基本类型和签名
第9章:字段和数据常量
第10章:方法
第11章:泛型类
第12章:泛型方法
IL指令相关,主要是如何翻译高级语言写成的函数,类似C++到asm:
第13章:IL指令
特殊的
第14章:异常相关处理
第15章:事件和属性 , 事件和属性本质上还是对方法的调用。只是过程被规范化了
第16章:用户自定义属性相关
本来想的是在生成的il文件上做文章,看完之后有个想法:
混淆器已经支持函数重命名,并且可以更改其命名空间,那它肯定有生成IL的地方,然后调用ilasm.exe来生成新的模块。
找了一下,果然是, MethodDefinition.Body.Instructions 就是函数体,可以直接在这里添加profiler的函数指令。
如果添加后的函数体指令长度超过127,则需要将所有短指令改成长指令了。
看来可以动手研究怎么用Mono.Cecil了。
另外一个方向,调试u3d的代码,以UnityEngine.Camera.Render()为目标,我尝试在函数体里增加Debug.Log的指令,报错了..
这个函数是 internalcall类型的函数,不能有body,去掉internalcall之后,untiy的editor就打不开了...
第5章描述过,CLR会检查元数据头和实际代码的一致性,到底internalcall的函数能否插代码,还需要进一步考察。