文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>CLR via C# 第一章

CLR via C# 第一章

时间:2011-03-19  来源:adobe_fans

1.3加载公共语言运行时CLR:

程序集可以是一个exe,也可以是一个dll(其中包含一组由exe使用的类型)

如果程序集只包含类型安全的托管代码,那么所有代码能在32位或64位的windows系统上运行。如果要用不安全的代码或面向特定cpu的非托管代码,那么可使用/platform指定运行环境,默认为anycpu:任何windows版本。

运行一个exe时,windows会检查这个exe的文件头,判断需要32位地址空间或64位,根据PE32或PE32+。然后windows会在进程的地址空间中加载MSCOREE.dll的X86或X64版本(分别位于不同目录中),接着,进程的主线程调用MSCOREE.dll中定义的一个方法,这个方法初始化CLR,加载exe程序集,然后调用其入口方法Main,随即,托管的应用程序将启动并运行。

1.4执行程序集的代码

托管程序集同时包含元数据和IL,IL是与cpu无关的机器语言,IL能访问和操作对象类型,并提供异常处理。C#编译器将生成IL,IL也可用汇编语言来写,(IL汇编器:ILAmsm.exe和IL反汇编器ILDasm.exe)。C#等高级语言通常只公开了CLR的所有功能的一个子集,IL汇编能访问CLR的所有功能。

为了执行一个方法,必须把它的IL转换成本地的cpu指令,这是CLR的JIT的职责。即时编译器。

一个方法的首次调用:

在main执行前,CLR检测出main的代码应用的所有类型,这会导致CLR分配一个内部数据结构,它用于管理对引用的类型的访问,这个内部的数据类型的每个方法都有一个对应的记录项,每个记录项都能容纳一个地址,根据此地址即可找到方法的具体实现,对这个结构进行初始化时,CLR将每个记录项都设置成(指向)包含在CLR内部的一个未文档化的函数:JITCompiler,JITCompiler函数负责讲一个方法的IL代码编译成本地CPU指令。

JITCompiler函数被调用时,它知道要调用的是哪个方法,以及具体是什么类型定义了该方法,然后JITCompiler函数会在定义(该类型的)程序集的元数据中查找被调用的方法IL,接着JITCompiler验证IL代码,并将IL代码编译成本地cpu指令,本地cpu指令被保存到一个动态分配的内存块中,然后,JITCompiler返回CLR为类型创建的内部数据结构,找到与被调用方法对应的那一条记录,修改最初对JITCompiler的引用,让它现在指向内存块(其中包含了刚才编译好的本地cpu指令)的地址,最后JITcompiler函数跳转到内存块中的代码。这些代码执行完毕后,返回到main中的代码,并继续执行。

main中第二次调用同一个方法时,这一次,由于已对方法的代码进行了验证和编译,所以会直接执行内存中的代码,完全跳过JITcompiler函数,执行完毕后,会再次返回main。

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载