GetClassification() || mcArray == GetClassification(); } 这儿 IsSpecialStub(), IsIL(), IsECall()等等方法,实际上都是通过 GetClassification() 获取方法类型来进行判断的。而此方法类型则是编译器根据 MethodImplAttribute 等标记,在编译时写入到 Metadata 中。对 MethodImplOptions.InternalCall 来说,实际对应于 mcECall 这种类型。其他的 CLR 内部调用类型,以后有机会再详细介绍。 对于 GetClassification() 返回 mcECall 这种情况,实际上时通过 FindImplForMethod() 函数完成的。此函数在 RVA 为 0 的情况下,会调用 FindECFuncForMethod 从一个全局 ECall 注册表中查找 InternalCall 的实现代码所在。 以下内容为程序代码: void* FindImplForMethod(MethodDesc* pMDofCall) { DWORD_PTR rva = pMDofCall->GetRVA(); // ... if (rva == 0) { ret = FindECFuncForMethod(pBaseMD); } // ... } 不过与 Rotor 的实现不太一样的是,.NET Framework 1.1 为效率做了很多额外的优化工作。如前面的 DumpMD 命令结果所示,CLR v1.1 中 Int页码:[1] [2] [3] [4] [5] [6] [7] [8] [9] 第7页、共9页 |