读经典——《CLR via C#》(Jeffrey Richter著) 笔记_运行时解析类型引用
2024-10-19 02:27:56
public sealed class Program{
public static void Main() {
System.Console.WriteLine("Hi");
}
}
程序运行时,CLR会加载并初始化它。CLR读取程序集的CLR头,查找标识了应用程序入口方法(Main)的MethodDefToken。然后,CLR会检索MethodDef元数据表,找到该方法的IL代码在文件中的偏移量,把这些IL代码JIT(just-in-time)编译成本地(native)代码。编译时会对代码进行验证以确保类型安全性。最后,将执行本地代码。下面展示了Main方法的IL代码。(运行ILDasm.exe可以生成)
.method public hidebysig static void Main() cil managed
//SIG: 00 00 01
{
.entrypoint
//Method begins at RVA 0x2050
//Code size 11 (0xb)
.maxstack
IL_0000: /* 72 | (70)000001 */
ldstr "Hi"
IL_0005: /* 28 | (0A)000003 */
call void [mscorlib]System.Console::WriteLine(string)
IL_00a: /* 2A | */
ret
}//end of method Program::Main
对这个代码进行JIT编译时,CLR会检查对类型和成员的所有引用,并加载定义了它们的程序集(如果尚未加载)。可以看出,上述IL代码有一个对System.Console.WriteLine的引用。具体地说,IL call 指令应用了token 0A000003.这个token对应于MemberRef源数据表中的记录项3.CLR检查这个MemberRef记录项,发现它的一个字段引用了一个TypeRef表中的一个记录项(System.Console类型)。根据TypeRef记录项,CLR被引导至一个AssemblyRef记录项:“mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”.这样,CLR就知道了它需要的是哪一个程序集。接着,CLR必须定位并加载该程序集。
解析一个引用的类型时,CLR可能在以下三个地方找到类型。
- 同一个文件
- 不同的文件,同一个程序集
- 不同的文件,不同的程序集
下图为一个类型绑定的图解过程:
最新文章
- 区间dp总结篇
- 接口测试第十二课(fidller过滤)(转)
- EntityFrameWork使用
- github-ssh
- SQL语句中count(1)count(*)count(字段)用法的区别
- 阿里云DRDS:分布式数据库服务
- (进阶篇)Cookie与 Session使用详解
- ViewPager 滑动页(三)
- hibernate hbm2ddl auto 不能创建表的问题
- Eclipse Clojure 开发插件
- FineUI Grid 缓存列显示隐藏状态
- 一个好用简单的布局空间EasyUI
- .net做的exe和electron做的exe之间的通信问题
- vim下单行长文本的时候卡顿解决办法
- Linux系统软件安装的几种方式
- 关于GCJ02和WGS84坐标系的一点实验
- hbase 性能优化 (转载)
- centos7.5 安装gaussian09和 gaussianview4
- 第一册:lesson fifty three。
- redis复制
热门文章
- Android 媒体编解码器(转)
- django的render的说明
- Oracle pl/sql 记录、表类型
- html标签的显示模式(块级标签,行内标签,行内块标签)(转)
- SqlServer中把结果集放到到临时表的方法(转)
- 解析IFC数据并转成json格式
- CentOS6.5 安装python
- 终极解决傻X阿里钱盾新手开店及老卖家复核身份证照片模糊无法对焦问题
- GitHub Pages搭建博客HelloWorld版
- Head First HTML与CSS(第2版) 中文pdf扫描版​