C#在.NET编译执行过程

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

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

2.   程序的编译过程

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

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

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

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

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

3.编译和执行过程图

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

调试 ms 源代码

首先需要下载 dotPeek ,可以到官网下载 dotPeek: Free .NET Decompiler & Assembly Browser by JetB...

1111
来自专栏WindCoder

windows 查看及结束端口占用情况方法简记

taskkill /f /im 使用中的小问题~请大虾们指教taskkill-百度百科

632
来自专栏zhangdd.com

redis官方集群安装升级ruby2.2.7版本

配置redis官方集群,开始使用yum 默认安装ruby到gem install  redis时报错,提示需要ruby>2.2.0

842
来自专栏黑泽君的专栏

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

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

2772
来自专栏.NET后端开发

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

1834
来自专栏子勰随笔

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

2368
来自专栏向治洪

Android Studio集成Genymotion

Android Studio集成Genymotion比在Eclipse中集成简单多了。主要以下几个步骤: 1、官网先下载Genymotion:http://...

2048
来自专栏mwangblog

Linux中的前台与后台运行

然而有时候需要将编译、压缩等耗时的工作放到后台运行,这个时候只需要在命令末尾加上&即可。

761
来自专栏GreenLeaves

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

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

2534
来自专栏Samego开发资源

致需要扩展ubuntu工具认识的Linuxer | apps shell

1283

扫码关注云+社区