首页 > 编程语言 >《NET CLR via C#》---第三章("运行时"解析类型引用)

《NET CLR via C#》---第三章("运行时"解析类型引用)

时间:2024-07-30 20:06:37浏览次数:12  
标签:文件 via C# 程序 --- 引用 类型 CLR 加载

"运行时"解析类型引用

  1. 首先在"C:\Users\LH89\source\repos"目录下,新建Console1工程(C#控制台)
    image
  2. 实现简单的代码,并编译为程序集(假定名为Program.exe)
using System;

public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World");
    }
}
  1. 运行应用程序,CLR会加载并初始化自身,读取程序集的CLR头,查找标识了应用程序入口方法(Main)的MethodDefToken,检索MethodDef元数据表找到方法的IL代码在文件中的偏移量,将IL代码JIT编译成本机代码,最后执行本地代码。
  2. 通过对程序集运行ILDasm.exe并选择“视图/显示字节”,双击树形视图中的Main方法。
    image
  3. 对这些代码进行JIT编译,CLR会检测所有类型和成员引用,加载它们的定义程序集(如果尚未加载)。
  4. 上述代码包含对System.Console.WriteLine的引用。具体来说,IL call指令引用了元数据token 0A000011。该token标识MemberRef元数据表(表0A)中的记录项。CLR检查该MemberRef记录项,发现它的字段引用了TypeRef表中的记录项(System.Console类型)。按照TypeRef记录项,CLR被引导至一个AssemblyRef记录项:“mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”,这时CLR就知道了它需要的是哪个程序集。接着,CLR必须定位并加载该程序集。
    image
    image
  5. 解析引用的类型时,CLR可能在以下三个地方找到类型。
  • 相同文件
    编译时便能发现对相同文件中的类型的访问,这称为早期绑定。类型直接从文件中加载,执行继续。
  • 不同文件,相同程序集
    “运行时”确保被引用的文件在当前程序集元数据的FileDef表中,检查加载程序集清单文件的目录,加载被引用的文件,检查哈希值以确保文件完整性。发现类型的成员,执行继续
  • 不同文件,不同程序集
    如果引用的类型在其他程序集的文件中,“运行时”会加载被引用程序集的清单文件。如果需要的类型不在该文件中,就继续加载包含了类型的文件。发现类型的成员,执行继续。
  1. 在上例中,CLR发现System.Console在和调用者不同的程序集中实现。所以,CLR必须查找哪个程序集,加载包含程序集清单的PE文件。然后扫描清单,判断是哪个PE文件实现了类型。如果被引用的类型就在清单文件中,一切都很简单。如果类型在程序集的另一个文件中,CLR必须加载那个文件,并扫描其元数据来定位类型。然后CLR创建它的内部数据结构来表示类型,JIT编译器完成Main方法的编译。
    image

标签:文件,via,C#,程序,---,引用,类型,CLR,加载
From: https://www.cnblogs.com/chenxiayun/p/18330374

相关文章

  • (10-2-01)智能行为决策算法:常用的智能行为决策算法-------马尔可夫决策过程(MDP)
    10.2 常用的智能行为决策算法在实际应用中,智能行为决策算法在自动驾驶系统中各有其独特的优势和应用场景,通过合理组合和优化,能够有效提升自动驾驶的安全性、可靠性和效率。在本节的内容中,将详细讲解常用的智能行为决策算法的用法。10.2.1 马尔可夫决策过程(MDP)马尔可夫......
  • c语言笔记(2024.7.24)第三天
    常量与变量概念:·表面:程序运行过程中取值可以改变的数据·实际:变量其实代表了一块内存区域/单元/空间。变量名可视为该区域的标识。整个变量分为三部分:·变量名:这个只是变量的一个标识,我们借助变量名来存取数据。·变量空间/存储单元:这个就是内存中分配的一块用来存放......
  • 嵌入式初学-C语言-练习二
    #针对于前六篇学习所出习题,题型内容均为本人敲写,若有不合理,或逻辑重复,请多多包涵,也请大家指点!!#1、通过键盘输入一个年份,判断是不是润年,是显示“是润年”,否则显示“不是润年”#include<stdio.h>intmain(){unsignedintyears;printf("输入一个年份\n");scanf("%d......
  • c语言(单,双,三分支)swich的运算
    分支结构分支结构:又被称之为选择结构概念选择结构:根据条件成立与否,选择相应的操作。条件构建关系表达式:含有关系运算符的表达式(>,<,>=,<=,!=,==)逻辑表达式:含有逻辑运算符的表达式(&&,||,!),往往是用来构建复杂的复合条件,比如:if(year%100==0&&year%4!=0)//这种......
  • 数据集相关类代码回顾理解 | np.mean\transforms.Normalize\transforms.Compose\xx
    数据集相关类代码回顾理解|StratifiedShuffleSplit\transforms.ToTensor\Counter目录np.meantransforms.Normalizetransforms.Composexxx.transformnp.meanmeanRGB=[np.mean(x.numpy(),axis=(1,2))forx,_intrain_ds]计算每个样本的(RGB)均值  。NumPy库np.......
  • 暑期学习C语言第一天完整版
    回顾今日成果:一、scanf语句的掌握我们可以看一看这道题,只是一个简单的整数输入、输出。在这之中,我们就可以利用scanf、printf语句,在使用scanf语句我们需要注意:scanf(“%d”,&a);printf("%d",a);其中关键点为,在使用scanf时,%d在双引号里面和&a中&是我们容易遗忘。二......
  • DC-9
    DC-9信息搜集探测局域网内存活主机nmap-sP192.168.19.128/24发现主机192.168.19.138,扫描开放端口nmap-p-192.168.19.138发现只有80端口开放.访问发现是一个员工信息管理系统.渗透用whatweb扫描查看网站信息,发现啥也没有.发现在search页面中存在搜索框可以查询员......
  • python高性能计算:cython使用openmp并行 —— 报错:undefined symbol: omp_get_thread_n
    test.pyx文件:fromcython.parallelcimportparallelfromopenmpcimportomp_get_thread_numcpdefvoidlong_running_task1()noexceptnogil:whileTrue:passcpdefvoidlong_running_task2()noexceptnogil:whileTrue:passdefdo......
  • 数据大屏解决方案scale
    最近公司之前的数据大屏进行一个UI的调整但是我看之前的数据大屏在自适应方面做得并不好所以在网上冲浪过后选择了使用scale来解决数据大屏的适配一dom结构<divid="container"><divid="box"></div></div>二dom样式#container{width:100vw;height:10......
  • springboot+vue基于微服务架构的设备管理系统【程序+论文+开题】-计算机毕业设计
    系统程序文件列表开题报告内容研究背景随着企业规模的不断扩大与信息化程度的日益加深,设备管理成为企业运营中不可或缺的一环。传统集中式架构的设备管理系统在面对大规模数据处理、高并发访问及系统扩展性等方面显得力不从心。微服务架构以其高度的模块化、灵活的服务部署......