C#在.NET编译执行过程

1..NET语言的编译器接受源代码文件,并生成名为程序集的输出文件。

  • 程序集要么是可执行的,要么是DLL
  • 程序集里的代码并不是本机代码,而是一种名称为CIL的中间语言
  • 程序集包含如下信息:
    • 程序的CIL
    • 程序中使用的类型的元数据
    • 对其他程序集引用的元数据

2.   程序的编译过程

   程序的CIL直到它被调用运行时才会被编译成本机代码。在运行时,CLR执行下面步骤:

  • 检查程序集的安全特性
  • 在内存中分配空间
  • 把程序集中的可执行代码发送给实时编译器(JIT),把其中的一部分编译成本机代码。

程序集中的可执行代码只在需要的时候由JIT编译器进行编译,然后它就被缓存起来以备在后来的程序中执行。这就意味着不被调用的代码不会被编译成本机代码,而且被调用的代码只被执行一次。

一旦CIL被编译成本机代码,CLR就在它运行时管理它,执行像内存释放、数组边界检查、检查参数类型、异常管理等任务。有两个重要的术语由此而生。

  • 托管代码:为.NET框架编写的代码称为托管代码,需要CLR
  • 非托管代码:不在CLR控制下运行的代码,比如Win32 C/C++ DLL,称为非托管代码

3.编译和执行过程图

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

解决在SecurecCRT登录后,发现方向键、backspace(退格键)、delete(删除键)为乱码的问题

问题:使用securecrt ssh到linux之后,backspace(退格键),delete(删除键),以及4个方向键都为乱码,不能正常使用。按tab键也没...

1792
来自专栏dalaoyang

Linux安装RabbitMQ

本文环境是在腾讯云服务器CentOS7.2搭建的,RabbitMQ 3.6.8, Erlang R16B03-1

2282
来自专栏子勰随笔

iMac(OS X)日常开发中各种代理设置方法汇总(shell、Android Studio、gem、npm)

2008
来自专栏.NET后端开发

RabbitMQ消息队列系列教程(二)Windows下安装和部署RabbitMQ

1664
来自专栏施炯的IoT开发专栏

Windows Phone SDK update for Windows Phone 7.8

微软将于近日正式推送WP 7.8的更新,同时发布了SDK的更新。 在安装7.8更新之前,用户必须安装Windows Phone SDK 8.0 或者 Windo...

1776
来自专栏jerryteng的专栏

学习Go语言-GOPATH有多工作区的问题

首先在查找依赖包的时候,总是会先查找 GOROOT目录,也就是go语言的安装目录,如果没有找到依赖的包,才到工作区去找相应的包。

4903
来自专栏GreenLeaves

六、CLR下的托管代码应用程序与非托管代码程序之间的性能对比

1、托管程序二次编译的问题,以及微软做的优化 五、CLR加载程序集代码时,JIT编译器对性能的产生的影响中介绍了CLR下托管应用程序的二次编译对性能产生的影响....

2484
来自专栏黑泽君的专栏

Eclipse重写toString()出现错误,求怎么解决?

其实是Java9和eclipse有bug冲突,但是不知道,怎么解决?先自己手写吧,以后解决了,再分享!

981
来自专栏韩东吉的Unity杂货铺

零基础入门 25:MonoDevelop模板和快捷

Hello,几天没更,一些小伙伴在后台给我留言想咨询一下关于monoDevelop这个IDE的一些快捷方式和模板导入导出等,是如何做到的?

1063
来自专栏蓝天

安装Android SDK Manager的“Failed to fetch refused”问题解决方法

安装Android SDK Manager的“Failed to fetch refused”问题解决方法

833

扫码关注云+社区