托管程序和非托管程序的区别
2013-01-03 11:03
239 查看
今天看了几个前辈的博文,有个概念自己一直没有注意,今天把它们整理下发出来:
引用博文:/article/4816706.html
/article/6065955.html
一般一个可执行文件的内部都包含一个PE头,系统根据PE的信息找到入口函数,在通过执行入口函数中的代码来执行可执行程序。托管程序的文件中相对于非托管程序还包含了一个CLR表头文件以及其他CLR需要的信息。
(1)非托管程序的执行过程
在非托管程序中,可执行里面保存的是机器代码,CPU可以直接加载并执行,当系统加载了可执行程序后,系统就将可执行文件的段基址加上偏移地址形成实际的物理地址,并直接加载到内存中运行。
(2)托管程序的执行过程
托管程序的可执行文件中,包含的是中间语言以及元数据,当然不能直接运行,必须启动CLR,由CLR对中间语言进行即时编译成机器代码,并加载到内存里面执行(具体过程:程序在进入入口函数前会提前跳转到MSCoree.dll中,调用它的代码来启动CLR并完成一些初始化工作)。当然,IL中的方法并不是每次被调用都会被编译一次,而是它只有在第一次调用时才进行编译,即时编译器会将方法名称以及对应的入口地址存放在映射表中,当下次调用该方法时,会直接从映射表里去而不是再编译一次。
因为托管程序在运行前首先要编译器对其进行编译成可执行代码,所以在效率上会有所下降,但到底下降多少,通过下面的实验看看吧。
引用博文:/article/4816706.html
/article/6065955.html
一般一个可执行文件的内部都包含一个PE头,系统根据PE的信息找到入口函数,在通过执行入口函数中的代码来执行可执行程序。托管程序的文件中相对于非托管程序还包含了一个CLR表头文件以及其他CLR需要的信息。
(1)非托管程序的执行过程
在非托管程序中,可执行里面保存的是机器代码,CPU可以直接加载并执行,当系统加载了可执行程序后,系统就将可执行文件的段基址加上偏移地址形成实际的物理地址,并直接加载到内存中运行。
(2)托管程序的执行过程
托管程序的可执行文件中,包含的是中间语言以及元数据,当然不能直接运行,必须启动CLR,由CLR对中间语言进行即时编译成机器代码,并加载到内存里面执行(具体过程:程序在进入入口函数前会提前跳转到MSCoree.dll中,调用它的代码来启动CLR并完成一些初始化工作)。当然,IL中的方法并不是每次被调用都会被编译一次,而是它只有在第一次调用时才进行编译,即时编译器会将方法名称以及对应的入口地址存放在映射表中,当下次调用该方法时,会直接从映射表里去而不是再编译一次。
因为托管程序在运行前首先要编译器对其进行编译成可执行代码,所以在效率上会有所下降,但到底下降多少,通过下面的实验看看吧。
相关文章推荐
- C#关于托管程序和非托管程序的区别
- C#关于托管程序和非托管程序的区别
- 托管程序和非托管程序的区别
- 托管与非托管代码的区别
- 托管代码与非托管代码的区别
- 介绍托管程序与非托管程序的区别
- 托管和非托管区别
- 托管和非托管的区别(网上搜集的资料)
- 托管和非托管的区别
- 托管代码与非托管代码的区别
- 让 .Net 程序可以在自定义位置查找托管/非托管 dll 的几种方法
- 托管DLL和非托管DLL的区别
- 托管代码和非托管代码的介绍,以及在这区别下的混合调试方法
- 托管代码与非托管代码的区别
- 托管程序 与非托管程序的区别
- 郑州癫痫病医院zzdx.ycnews.cn癫痫病医院 托管程序与非托管程序的区别
- 托管代码与非托管代码的区别
- 托管和非托管的区别
- 介绍托管程序与非托管程序的区别
- C++ 非托管 程序调用托管程序