• 01.由浅入深学习.NET CLR 基础系列之CLR 的执行模型


    .Net 从代码生成到执行,这中间的一些列过程是一个有别于其他的新技术新概念,那么这是一个什么样的过程呢,有什么样的机制呢,清楚了这些基本的东西我们做.Net的东西方可心中有数。那么,CLR的执行模型是一个什么样的过程呢?   

    将源代码编译成托管模块 --> 将托管模块合并成程序集 --> 加载公共语言运行时 --> 执行程序集的代码   

    目录
    • 将源代码编译成托管模块
    • 将托管模块合并成程序集
    • 加载公共语言运行时
    • 执行程序集的代码
    • 本地代码生成器:NGen.exe
    • Framwork类库入门
    • 通用类型系统
    • 公共语言规范(CLS
    • 与非托管代码的互操作性 

      

    将源代码编译成托管模块 

    首先.Net开发是支持多语言选择或者混合语言编程的,代码的编译是采用编译器面向CLR的机制,即,无论何种语言编写的代码,只要采用的编译器是面向CLR的就可以了。   

    Common Language Runtime:公共语言运行时,可由多种编程语言使用的"运行时"。CLR的核心功能(比如内存管理,程序集加载,安全性,异常处理和线程同步)可由面向CLR的所有语言使用。

    Managed module:托管模块,即编译器编译的结果都是一个托管模块。

    IL:每个面向CLR的编译器生成的都是IL(中间语言)代码。也成为托管代码,因为CLR要管理它的执行。

    Native code compiler:本地代码编译器。生成的是面向特定CPU架构(X86、X64、IA64)的代码。

    Metadata:元数据。是一种数据表,其中一些数据描述了模块中定义的内容,比如类型和成员;还有些数据描述了模块引用的内容,比如导入的类型及其成员。元数据总是和包含IL代码的文件关联,永远是同步的。

      

      

    将托管模块合并成程序集

      

    上图显示了托管模块合并成程序集的过程。

    程序集(assembly)的理解:一个或者多个模块/资源文件的逻辑性分组;程序集是重用、安全性、版本控制的最小单元。

    从上图显示可看出程序集(assembly)包含一个名为"清单"(manifest)的数据块,它是由元数据表构成的另一种集合,描述了构成程序集的文件。

    另一个地方就是AL.exe:程序集连接器

      

    加载公共语言运行时

      

    Windows 检查EXE文件头:

    PE32:需要32位地址空间,可在32位/64位地址空间中运行

    PE32+:需要64位地址空间

    CPU架构信息,确保当前CPU是符合要求的

      

    创建32/64/WoW64位进程 根据exe文件头创建的

      

    加载MSCorEE.dll: 该文件在C:WindowsSysWow64 或 C:WindwosSys

      

    看上面的流程还是比较清晰的。

      

    执行程序集的代码  

    为了执行一个方法,首先必须把它的IL转换成本地的CPU指令。这是CLRJITjust-in-time或者"即时")编译器的职责。从示意图来分析其过程是如何的。

    1. Mian()执行之前,CLR先检测出Main的代码所引用的所有类型.
    2. 分配内部数据结构,用于管理所引用类型的访问,如图Console类型,Console类型定义的每一个方法都有一个对应的entry(记录项)。每个entry都容纳了一个地址,根据此地址即可找到方法的实现.对这个结构进行初始化时,CLR将每个记录项都设置成(指向)包含在CLR内部的一个未文档化的函数,这个函数即为JITCompiler
    3. Main函数首次调用WriteLine时,JITCompiler函数会被调用。

      JITCompiler 函数调用时,JITCompiler在定义该类型的程序集的元数据中查找被调用方法的IL

      -->验证IL

      -->编译成本地CPU指令

      -->返回到刚才的记录,并修改对JITCompiler的引用,指向刚才编译的内存块的地址

      -->JITCompiler函数跳转到刚才的内存块执行

      -->返回到Mian继续执行

        

    4. Main函数第二次调用WriteLine时

      

    本地代码生成器:NGen.exe

    NGen.exe:.NET Framework 提供的工具,可以在一个应用程序安装到目标计算机上时,将IL代码编译成本地代码。

      

    NGen.exe终于作用:

    1. 加快应用程序的启动速度
    2. 减少应用程序的工作集(working Set)

      

    位置:类似C:WindowsMicrosoft.NETFrameworkv4.0.30319

    命令语法:

    ngen <action> [options]

    ngen /? | /help

      

    Framework类库  

    FCLFramework Class Library 是一组DLL程序集的统称。

      

    通用类型系统 

    CTSCommon Type System,它描述了类型的定义和行为。

      

    公共语言规范  

    CLSCommon Language Specification

    相信混合语言的编程才迫使微软制定了CLS。CLS解决的问题是使用不同的语言创建的对象能够相互通信。要创建很容易从其他语言中访问的类型,只能从自己的编程语言中挑选其他语言都确定支持的那些功能。

    这就要求任何编译器生成的类型要想兼容于由其他"符合CLS、面向CLR的语言"所生成的组件,就必须支持这个最小功能集。

      

    告诉编译器需要检查CLS兼容性的语法

    [assembly:CLSCompliant(true)]

    namespace SomeLibrary

    {

    }

      

    与非托管代码的互操作性 

    为了迎合之前的非托管代码的用户,微软通过CLR提供了一些机制,允许应用程序中同时包含托管和非托管代码。

    1. 托管代码能调用DLL中的非托管函数
    2. 托管代码可使用现有的COM组件(服务器)
    3. 非托管代码可使用托管类型(服务器)

      

    本文还是主要学习了一些.NET平台设计的一些架构思想和概念,应该在整体上对.NET有一个基本的认识。

  • 相关阅读:
    Android:求职旺季,了解这份面试经验,自然无惧面试!
    2020上半年百度Android岗(初级到高级)面试真题全收录+解析,备战金九银十!(下篇)_chuhe1989的博客-CSDN博客
    泪目!阿里大佬国庆8天花了50个小时,整理出这份18万字Android-360&#176;性能优化实战解析_chuhe1989的博客-CSDN博客
    Android程序员面试必须要掌握的:Https加密原理、中间人攻击到底是怎么回事_chuhe1989的博客-CSDN博客
    @HTTPS 原理分析——带着疑问层层深入
    @Android 换肤那些事儿, Resource包装流 ?AssetManager替换流?
    @腾讯面试官:说说王者荣耀里面Android的换肤原理和Android的皮肤,装载机框架解析
    @Android 无缝换肤深入了解与使用
    @Android的换肤原理和Android的皮肤,装载机框架解析
    @Android小技巧--switch控件的用法
  • 原文地址:https://www.cnblogs.com/jtxs/p/4081752.html
Copyright © 2020-2023  润新知