现在的位置: 首页 > 综合 > 正文

图解DotNet框架之一:编译与执行引擎

2017年11月07日 ⁄ 综合 ⁄ 共 3863字 ⁄ 字号 评论关闭

(声明:本系列只想给大家介绍.net框架,并不是语法和类的使用的讲解,所以只能概括的描述一下所提到的类,如果有疑问可以到MSDN上面去查)    

 

众所周知,DotNet框架是非常庞大的,光项目创建时的种类就有WPF,WCF,WF这三种最新的技术,还有以前的Web,WinForm,Service,Mobile等等.
这么复杂和庞大的框架,用文字来描述是远远不够的,所以我准备写一系列图文并茂的文章,把我所知道的所有Net框架中的东西全部串联起来,希望可以给大家一个DotNet框架的知识图,本人能力有限,难免有理解错误和表达不清的地方,望大家谅解并指教.        
      好,我们现在就开始第一张图的学习,再所有的文章写完后,大家将会得到一个完整的框架图。

    

 

下面我会做出对这个图的解释,请大家对照图来一步一步的学习。

1.CTS  和 CLS :

    CTS:公共类型系统。他是一个集合{类,接口,委托,结构,枚举,类型成员,基本数据类型},只有符合CTS的类型才能在CLR上运行。简单点说就是VB,C#,C++等DotNet支持的语言的类型集合。这些东西大部分都定义在System.dll中,我们将在下一篇来讨论system.dll。
    CLS:公共语言规范。从图上可以看出,他是CTS的子集,为什么他是子集呢?因为在C#中有Ulong而VB中就没有。看以下代码

    public class Test
    
{
        
public ulong Add(ulong a, ulong b)  //如果某语言特有的类型,作为返回类型和参数则不遵循CLS
        {
            
return a + b;
        }

        
public int Add(int a, int b)   //但是作为局部变量则仍然遵循CLS
        {
            
ulong x;
            
return a + b;
        }
 
    }

    在默认.NET开发平台上是不会执行CLS检查的,如果要开启可以在AssemblyInfo.cs中加入代码

[assembly:System.CLSCompliant(true)]

大家可能要问,为什么要遵循CLS呢?答案在后面给出。

2. CIL,元数据和程序集清单

     CIL:公共中间语言。我们大家都知道,在.Net中使用VB写一个DLL,那么在C#的项目中也可以调用,反之亦然。如何实现的呢?就是CIL了,前面我们说过CLS的作用,并且留下了为什么要遵守CLS的疑问,就是因为.net编译生成的dll或Exe,其实主要是CIL,原数据和程序集清单这三部分组成。那么要想VB和C#共享,就要有一个通用的规范,它就是CLS了,呵呵,现在明白为什么要CLS了吧,如果你不去遵守CLS也是可以的,但是就不能保证你的dll的复用性了。
    元数据:.net的反射,远程处理,序列化这些东西都很神秘吧,其实他们都是原数据的功劳,你所定义的类,方法,方法的返回类型和参数,属性,字段,都会被编译成元数据,然后当你序列化或反射时,拿这些原数据给你生成一个类。
    程序集清单:这个就容易理解了,你添加的dll引用的信息全都在这里。下面是一个Dll中的信息。

    原代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    
class Program
    
{
        
static void Main(string[] args)
        
{
        }

    }

    
public class Test
    
{
        
public ulong Add(ulong a, ulong b)  //如果某语言特有的类型,作为返回类型和参数则不遵循CLS
        {
            
return a + b;
        }

        
public int Add(int a, int b)   //但是作为局部变量则仍然遵循CLS
        {
            
ulong x;
            
return a + b;
        }

    }

}

    使用.Net自带的 ILDisassembler.exe 察看的IL: 

.class public auto ansi beforefieldinit ConsoleApplication3.Test
       extends [mscorlib]System.Object
{
 .method 
public hidebysig instance int32 
          Add(int32 a,
              int32 b) cil managed
  
{
    
// Code size       4 (0x4)
    .maxstack  8
    IL_0000:  ldarg.
1
    IL_0001:  ldarg.
2
    IL_0002:  add
    IL_0003:  ret
  }
 // end of method Test::Add
}

    就是这三样东西组成的dll,让.net实现了远程处理的remoting,反射,序列化和跨平台,跨语言。关于跨平台的问题,我们在下一篇讨论。

 

上一篇我们讲解了CIL,CTS,程序集等内容,并且留下了一个问题,就是.net如何跨平台,我们现在就来弄明白这个问题.由于篇幅有限,请大家参照第一篇的图.
按照流程图我们该讲解mscoree.dll了
         

        由相关的.net进程来加载Mscoree.dll,对于相关进程我们在后面讲到Winform,ASP.NET时,将继续讲解.
        mscoree.dll:公共对象运行库执行引擎.由他来寻找所有要加载的dll的位置并且加载他们(必须包含mscorlib.dll 他是核心类库,包含大量的核心类型,System,system.io等).然后读取程序集中的元数据.所以mscoree.dll又被称为CLR的垫片.

        CLR:公共语言运行库.前面我们已经启动了他的垫片,那么下来就要.net的灵魂人物出场了,他就是CLR,如同Java的虚拟机一样,.net缺少了他,就成了残废了,呵呵.在mscoree.dll加载了类型以后,CLR会以特定的机器CPU来加载对应的dll(mscorwk.dll或者mscorsrv.dll,这就是.net的性能为何很好的原因),然后CLR会在内存中为类型布局,将关联的CIL,运用JIT编译成特定平台的指令.嘿嘿,也许大家已经猜到了.net是如何跨平台的了吧.因为.net的dll实际是在运行时,才全部由各平台的JIT来编译成机器指令的.所以自然就可以跨平台喽.

        CLR中的GC:垃圾回收器. 我们知道.net中一般情况是不需要手动释放资源的,做过C++的人都知道手动释放资源意味着什么:莫名其妙的错误,无尽的深渊....,在.net中所有的托管资源都有GC这个保洁员来给你打扫卫生.CLR中会创建"对象图"和标示对象的"代".
        1.对象图说白了就是检查对象是否还可以在被引用.
        2.代这个概念是用来帮助GC快速的来检查哪些对象没有被引用,在.net中有0,1,2三代.0是新创建的对象,1是执行了一次回收以后,存在引用的对象,2是执行了一次以上回收,还没有被清理的对象.GC总是从0代开始回收,如果内存已经够用,则不对1代操作,否则就检查一代是否存在没有引用的对象.执行回收,如果还不够,就清理2代.

        我们来看看GC是如何工作的:

                     ABCDF被标示为  0代

            

我们现在回收0代的对象,因为BF没有引用,所以回收他们的内存,并且压缩托管堆.

                  现在  ACD被标示为  1代

        如果再来一次回收如果ACD依然没有被回收,那么他们就被标示为2代.OK,现在我们明白了GC是如何来释放资源的了.

       .net 进程:  一个.net进程中包含多个应用程序域,这就是.net平台操作系统独立性的关键特性,和完整的进程相比,应用程序域的CPU和内存都占用得比较少,因此CLR加载和卸载应用程序域(Appdomain)就快很多.
        应用程序域(Appdomain):其中包含多个需要的Dll和上下文(Context),也就是说每个Appdomain都有mscorlib.dll等dll,经过了这一步,就该是具体的应用程序了,如ASP.Net,WPF等不同形式的应用程序,再后续的文章里,将介绍他们的框架,最后再整合起来,就是完整的.net框架了,在这之前,我们先来学习一下.net中重要的几个Dll,给新  人打一下基础,高手们就不用看了,不过希望高手们可以指教一下。

 

下几篇中介绍.net中常用的Dll,然后再对各种应用程序做图解。

【上篇】
【下篇】

抱歉!评论已关闭.