首页 > 编程语言 >C#程序的执行过程

C#程序的执行过程

时间:2024-03-03 12:23:13浏览次数:27  
标签:调用 C# 代码 程序 IL WriteLine 执行 方法

一个C#程序的执行过程
可能很多人都知道我们把程序打包成dll就丢出去了,但是里面的具体的执行过程是怎么样的呢。

程序集是由元数据和IL组成的。IL是和CPU无关的语言,是微软的几个专家请教了外面的编译器的作则,开发出来的。IL比大多数机器语言都要高级一点。IL能够访问和操作对象类型,并提高了指令来初始化对象,调用对象上的虚方法以及直接操作数组元素。

比如下面这个例子

复制代码
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello");
Console.WriteLine("GoodBye");
}
}
复制代码
这是一个很普通的例子,首先我们把这个程序编译了生成了dll。然后再通过reflector来看看我们的dll是怎么样的。可以看到我们的代码变成了前面所说的IL代码。

为了执行这个方法,首先必须要先把方法里面的IL代码转换为本机的CPU指令。这就是CLR里面的JIT(即时)编译器的职责。

JIT的功能主要是这样的

1、在负责实现类型的(console)程序集的元数据中查找被调用的方法(WriteLine)

2、从元数据里面找到该方法的IL

3、分配内存块

4、将IL编译成本机的cpu指令,然后把这些东西扔进步骤三分配的内存块里面。

5、在Type表中修改对应的方法,让她指向步骤三分配的内存块

6、调到内存块执行本机代码。

当你第二次调用Console.WriteLine的时候,由于之前已经对WriteLine方法进行了验证和编译,所以到了第二次的话,就直接执行内存中的代码块了。

方法在首次被调用的时候,会有一些性能损失。以后对该方法的所有调用都以本机代码的形式全速运行。

标签:调用,C#,代码,程序,IL,WriteLine,执行,方法
From: https://www.cnblogs.com/wangtiantian/p/18049812

相关文章

  • redis和memcached的区别
    观点一:1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value交换到磁......
  • 基于CNN-GRU-Attention的时间序列回归预测matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述        CNN-GRU-Attention模型结合了卷积神经网络(CNN)、门控循环单元(GRU)和注意力机制(Attention)来进行时间序列数据的回归预测。CNN用于提取时间序列的局部特征,GRU用于捕获时间序列的长期......
  • IOC
    一、含义:(InversionofControl,英文缩写为IoC),是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。二、控制反转一般分为两种类型,依赖注入(DependencyInjection,简称DI)和依赖查找(DependencyLookup)。1、创建对象的步骤变复杂了,不......
  • C#性能优化总结
    1.ef查询数据库的时候一定要先写好条件查询最后再ToList(),一个方法最好只查询一次数据库。2.有的方法效率低查询慢,是因为更好的理解业务,没有想好到的查询快的办法。3.查询条件的先后顺序,字段加索引,表的数据量,join查询都是影响查询效率的因素。4.前端绑定数据,js写法,网络请求,页面......
  • C#高级
    //字典类List<Dictionary<string,string>>dics=newList<Dictionary<string,string>>();Dictionary<string,string>pairs=newDictionary<string,string>();pairs.Add("name1",&......
  • 并发编程之asyncio模块
    引言Python中的协程:协程是一种轻量级的用户级线程,它在单线程内执行,不会阻塞主线程,可以在多个任务间轻松地切换,因此可以用于实现异步I/O操作。协程的实现方式与生成器非常相似,通过使用yield语句来暂停和恢复执行。协程可以与asyncio库配合使用,来实现异步I/O操作。这种方式可以......
  • RabbitMQ、RocketMQ、Kafka区别
    引言1、队列应用场景:MQ(MessageQueue,消息队列)消息队列在实际应用中常用的使用场景(优点):异步处理,应用解耦,流量削锋和消息通讯四个场景。2、目前使用较多的消息队列:有老牌的ActiveMQ、RabbitMQ,ZeroMQ,炙手可热的Kafka,MetaMQ,阿里巴巴的RocketMQ。3、如何选型(目前现状):......
  • docker Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is th
    应该是docker异常关闭导致无法启动。步骤1参考《https://www.cnblogs.com/langgeligelang/p/14607658.html》执行systemctldaemon-reloadsystemctlrestartdocker如果失败,提示Authorizationnotavailable.Checkifpolkitserviceisrunningorseedebugmessagef......
  • C++第二课 while循环
    循环while(条件){   循环体}#include<bits/stdc++.h>usingnamespacestd;intmain(){   inti,s;   i=1;   s=0;   while(i<=100)   {      s=s+i;      i=i+1;   }   cout<<s<<endl;   return0;}计算1......
  • 并发编程之条件Condition
    条件Condition(了解)使得线程等待,只有满足某条件时,才释放n个线程importthreadingdefrun(n):con.acquire()con.wait()print("runthethread:%s"%n)con.release()if__name__=='__main__':con=threading.Condition()foriinra......