zoukankan      html  css  js  c++  java
  • CLR via C# 第一章 (2)

    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。

  • 相关阅读:
    jQuery Ajax 实例 全解析
    用Javascript评估用户输入密码的强度
    常用网址
    常用的107条Javascript
    根据键盘操作表格
    HTML5吧
    css3动画简介以及动画库animate.css的使用
    jquery插件下载地址
    CEO、COO、CFO、CTO
    springboot与shiro配置
  • 原文地址:https://www.cnblogs.com/Adobe_fans/p/1988805.html
Copyright © 2011-2022 走看看