一个C#程序的执行过程

Posted 山的那边是什么

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个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#程序的执行过程的主要内容,如果未能解决你的问题,请参考以下文章

C#程序员经常用到的10个实用代码片段 - 操作系统

当活动被破坏但我必须继续执行片段中的代码时该怎么办?

转解决存储过程执行快,但C#程序调用执行慢的问题

C#程序员经常用到的10个实用代码片段

在c#中计算执行前存储过程的执行时间

C#开发微信小程序