(一).NET 框架开发平台体系结构(笔记)

      要想深入研究一门言语,必须先了解其体系架构。回顾这些年只重视.NET应用,而忽视了平台的研究,现在回过头来再看.NET框架开发设计,感慨颇多。俗话说好记性不如烂笔头,借助博客来总结一些.NET框架开发设计经验。

    1. 将源代码编译成托管模块

         .NET 核心是CLR 通用语言运行时,各种语言经过各自编译器,将源代码编译成托管模块(如:c# =》C#编译器 =》托管模块(IL及元数据)),其中元数据是一种数据表的集合,包含托管代码定义的各种类型,方法,同时还包含了引用信息。

       托管模块包含:PE表头(指出文件类型,文件创建时间,本地cpu代码一些信息),CLR表头(标记托管代码入口方法),元数据,IL代码)

       C++默认是非托管模块。  

    2. 将托管模块组合成程序集

         CLR 不直接与托管模块打交道,而是与程序集(assembly)。

         程序集是由一个或多个托管模块以及一些资源文件的逻辑组合,同时也是组建复用,实施安全策略和版本策略的最小单位 。

         程序集中包含一个清单(描述组成程序集的文件)数据块,版本 自描述信息,即包含CLR执行的所需的所有信息,不需要注册表或者活动目录的额外信息,因此部署程序集要比非托管组件容易。 

    3. 加载通用语言运行时

            MSCOREE.DLL(微软组件对象运行时执行引擎)。

           程序集dll的入口函数如何加载CLR?  

           编译器/连接器创建可执行程序集时,会在PE中的.text部分写入一个X86 的stub 函数  JMP _COREXEMAIN (该方法来源于MSCOREE.DLL),MSCOREE.DLL 被引用到.data部分。

           当托管exe文件被调用,windows将像对待通常(非托管)的exe一样,首先加载该文件,然后检查data,发现 MSCOREE.DLL后,将其载入进程地址空间,于是就加载COREXEMAIN函数的地址,并修正X86 的stub 函数。

           主线程执行修改后的X86 的stub 函数,该函数跳转到COREXEMAIN函数地址上。COREXEMAIN初始化CLR,并查询程序集的CLR表头确定入口函数,入口函数找到后,IL代码被编译成本地CPU指令。

          最后CLR跳转到编译好的CPU指令地址上,执行。

         注意 托管PE文件都是32位,64window加载器会给其分配64位地址空间。

    4. 执行程序集代码(IL与代码验证)

 知识产权保护:(IL反编译)

            A. 代码 在公司服务器上,外界很难获取到

            B.  对外发布的代码可以加入混淆器,或者部分敏感算法可以采用非托管代码编写

        托管代码:

            A. CLR 语言集成优势(许编程语言之间方便切换与集成),可以采用C#的I/0处理,APL工程计算。

            B. 独立于底层CPU

            C. 第一次需要编译于验证,后续执行本地代码

         托管代码与非托管代码性能:

            编译器对于执行环境的了解多于非托管编译器,

           A.JIT  可以利用cpu特殊指令,而非托管的只是用最小的通用功能集合cup平台。

           B. JIT 能检查到运行时的机器上某些总是返回错误的布尔测试,不产生cup代码

           C. CLR能够评估执行情况并有选择性的将IL代码编译成本地代码


         IL代码验证,试代码更健壮。验证的过程有:不能从未初始化的的地址取值,每个方法调用时必须传入正确的参数个数,正确的参数类型,每个返回值是否正确使用,每个方法必须有返回值等。

         托管代码验证的健壮性,不会访问不该访问的地址空间,可以不独立未其开辟进程空间,即可以共用。

    5. .NET框架类库

         框架类库(Framwork Class Library   FCL).

    6. 通用类型系统

         通用类型系统(Common type system   CTS).

         CTS 只支持单继承,所有类型直接或者间接继承System.Object。

         System.Object 运行操作如下:

             判断两个实例是否相等;获取实例的散列码;查询实例的类型;执行实例的浅拷贝;获取实例当前状态的字符串表示。

    7. 通用语言规范

          COM允许不同语言创建的对象相互通信。CRL 集成所有编程语言,允许一种语言创建的对象在另一种语言代码中被看做同等成员。CLR 的标准类型集合,自描述类型信息(元数据) 和通用执行环境使之成为可能。

        各语言的差别很大,比如不区分大小写,不提供无符号的整数,不支持运算符重载,不支持可变数目的参数。

          通用语言规范(CLS) 定义了所有CRS编译器必须支持的最小特性集合。

           

         在类前面 加上特性 [assembly: CLSCompliant(true)]  //告诉编译器执行CLS检查

         internal 不能用于程序集外,所以不参与CLS检查。关于CLS规则,详见SDK“跨语言互操作”部分。

         有些特殊的抽象,没有映射在字段,方法上,而是在附加在类型信息上。

    8. 与非托管代码互操作

           CLR 支持三种互操作:

              托管代码调用非托管的dll

             托管代码调用com组件(非托管类型作为COM服务器)

              非托管代码 调用托管类型(托管类型作为COM服务器)(需要加入#using // 使用定义在该程序集的托管类型  clr编译)

              

   

  

你可能感兴趣的:(.net,框架程序设计)