.net Framework 框架的运行原理

时间:2022-12-23 21:20:30

 开始C#语言 的基础学习了~~

 学习之前首先的了解一下这个语言的运行 运行原理。

C#语言一般执行过程:

 先了解下名称:

 1、CLR--公共语言运行库,

 2、托管代码:通常在CLR的控制下运行的代码称为托管代码(managed code)

 3、IL代码:也就是我们看到的Assembly(dll,exe等文件)

源代码(cs等文件)--->编译为IL代码,双击exe文件,CLR程序自动启动,加载exe文件,并根据引用情况,加载dll文件
找到主入口main方法,即时将IL代码编译为机器代码,执行,根据引用的情况,不断的加载IL代码,编译为机器代码,执行,执行完了以后不会把编译好的代码清除出内存,下载直接用。

问题一:大家都知道.net的软第一次运行会慢点,以后就快了,这个第一次是指什么?比如,我打开一个A软件,第一次运行会慢点,然后就快了,我再关掉,再打开,还是会慢吗?
也就是C#每次打开运行都要即时编译,还是第一次运行编译后一直驻留在本地映像中,以后再打开就从本地映像中读

回答:

加载CLR(公共语言运行库),建立程序域,每个程序域里面的代码只编译一次,退出程序域就清空
一般桌面窗口程序,就一个程序对于一个程序域,程序退出,下次进去就又需要重新编译了
asp.net就是多个网站共享一个程序域的,这样共享的引用会不因为一个网站退出而重新编译


 问题二:即然第一次运行时编译成本地代码了,为什么在运行时,仍需要程序中dll文件支持(比如,打开软件后,编译完成后,我删掉一个dll文件,程序就没法运行了)
编译成本地代码的概念不是说生成了一个文件,只是在内存里编译好了,如果删除dll,那下次如何再次编译?程序还在使用dll也不允许删除呀


回答:C#编译经历了几个阶段,是由IL文件直接编译成本地机器码,还是要经历编译成C,汇编等过程
源代码 到 IL中间语言,这是可以分发了 在别的机器运行时,才真正编译到机器语言,和传统的编译语言不同。
编译器从来都不会编译为c,汇编等语言的吧。以前有说c++需要先编译为c,现在不知道,汇编就是机器语言,一一对应。

 

这个帖子我觉的讲的很详细:

 http://topic.csdn.net/u/20090708/09/946d9c8d-25a9-4c67-9b10-13ef7c9216aa.html