`
jishublog
  • 浏览: 865734 次
文章分类
社区版块
存档分类
最新评论

浅析.NET

 
阅读更多

学术交流,我们组准备的是《.NET与VB.NET》,我负责的是.NET Framework基础与VB.NET编译原理这两个主题,但是我写着就发现,如果了解.NET Framework,VB.NET编译原理实际上包括在这里面的,所以写着写着就变成了一个主题,本文就从宏观上来给大家介绍一下.NET。

思维导图

为了从宏观角度看,我画了一个思维导图。

具体来说,我要说的几个方面是:

什么是框架

解释.NET之前,得先来说一下什么是Framework,翻译过来就是“框架、架构、结构、体系”,总而言之它指的是一类事物、问题的宏观指导和解决方案。所以我们可以把.NET Framework理解为.NET这一整套体系的指导和解决方案,这算是一个概念,实例化之,就是你安装的.NET Framework x.x。

.NET目的

我们在学一个知识之前要知道它从何而来,要做何用,我的理解是.NET 推出的原因主要有这几点:

  • 跨语言
  • 跨平台
  • 管理机制
  • 与JAVA体系抗衡
以下会着重来说前两点。

.NET组成

按照先宏观再细节,逐层细化的原则,我们首先需要看看.NET组成。

.NET组成图

如果一上来就按下面左边这张图说,老师该揍我了,所以画了下面右边这张图,这样从上而下逐层看会更容易理解。

FCL

因为本文只是宏观的介绍,所以它所代表的英文缩写大家百度即可。

FCL在.NET中表现为各种各样的类,例如写一个语句:

 SqlConnection con = new SqlConnection(conn);
实际上使用的就是FCL中的SqlConnection类,因为都是一些“静止”概念的类,我们可以把它理解为.NET的"属性",根据它们之间自上而下的依赖,分为三层:


  • 基础类库,由BCL大部分组成,说白了就是.NET中一些基础类。
  • 功能类库,XML类库、GDI+等,它包含的是对操作系统功能的封装的类,如I/O操作等的类。
  • 应用程序层,WinForm、Asp.NET,每个编程语言特有的类。

BCL

如上面所说,它是.NET类库的基础部分,大部分包含在FCL中的系统类库中,是最基础的类库,我们以新建一个C#项目为例,新建后打开对象浏览器,看到的mscorlib,就是BCL的一员,它在引用中是无法删除的。

CLR

它是.NET的执行引擎,负责的是对FCL中类的操作和使用,我们可以把看做.NET的"函数、事件"(即动态),它主要有两个方面的作用。
  • 和JAVA的JVM一样,它保证应用和底层操作系统之间解耦合
  • 负责.NET程序的自动管理,比如资源管理、安全检查、异常管理等。
看一下CLR的常见功能图:


CTS和CLS

CTS是一套规则、一个协议,是对语言宏观的规范,定义了语言可以做什么,不可以做什么,具有哪些特性。

任何符合这套规则的高级语言就可以称为面向.NET框架的语言(不必全部符合),这意味着.NET拓展性非常好,可以添加其它高级语言。

CLS是CTS的一个子集,它也是一套规则协议,不过和CTS不同的是,它是对语言细节的规范:以.NET平台为目标的语言必须支持的最小特征,例如是否区分大小写、命名规则、标识符、构造函数如何使用……

从上面的组成图可以看到,CTS和CLS位于编程语言和CL之间,这两者的作用就是规范和接口,使不同的编程语言都可以和FCL相通,当然,这就减少了不同语言之间引发的互操作性问题

MSIL

微软中间语言,它类似于汇编语言:比机器语言高级,但又不是高级语言。它是代码编译后的中间语言,它没有与CPU或操作系统挂钩的内容,所以是与CPU解耦的,之所以说它是中间语言,是因为.NET下所有的语言编译后都是MSIL。

因为它是一种中间语言,CPU不能直接执行,所以MSIL经过即时编译器的解释,才形成了可执行的机器代码,虽然比以前类似VB的语言多了一步,但是这为跨平台执行提供了可能。

元数据与清单

它是编译后的一组表格,这个表格包含了所编译内容的基本信息,例如:规定在程序中编译哪些类、 类的成员信息、依赖于哪些程序集……。它相当于一个清单、目录,将一些宏观的内容提取出来,方便程序查阅。

之所以啰嗦讲这么多的概念,是为后面跨平台、跨语言的解释做准备。

跨语言

.NET下很优秀的一个功能就是跨语言,何为跨语言?就是.NET上不同语言可以相互使用,甚至继承,为此写了一个简单的Demo:大意是使用VB.NET写一个类并编译成dll,在C#中引用,并继承使用。

VBNETClass.vb

VB.NET语言编写的一个类,很简单,只是返回一个字符串,表明这是一个VB.NET的类。

    Public Class VBNETClass
        Public Function GetClassType() As String
            Return "My type is VB.NET"
        End Function

    End Class

打成dll并引用到C#项目中:


加红显示的VBNET即是我们编译上面VBNETClass类形成的dll,加红显示的其它内容表明这是一个C#程序。

CSharp.cs

添加对VBNET的引用,新建了一个名为CSharp的C#类,使用其继承VBNETClass。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VBNET;

namespace WindowsFormsApplication1
{
  public  class CSharp :VBNETClass
    {
      
    }
}
因为继承,类CSharp中已包含VBNETClass的GetClassType()函数。

执行

写成一个窗口程序,执行。

        private void button1_Click(object sender, EventArgs e)
        {

            CSharp csharp = new CSharp();
            MessageBox.Show(csharp.GetClassType().ToString());
        }

运行结果


为什么用两种不同语言编写的可以相互引用?下面即将揭晓……

跨平台

所谓的跨平台,是指可以跨越操作系统或硬件,例如windows系统下编的考试系统可以运行的Linux下,下面这张图显示的是常见的操作系统和CPU。

二者原理

跨语言和跨平台的原理是什么?

跨语言

还记得上面提到的MSIL、CLS和CTS、元数据和清单否?正是因为这几部分的配合,才实现跨语言,以上面咱们的跨语言例子为例,流程如下:
  • VB.NET和C#都符合CTS,从而保证二者有一致的行为基础
  • CLS的存在,使得二者有数据类型的通信基础,映射关系如下:
  • 二者相互通信

跨平台

例如要在Linux下运行Windows下编译的程序,首先需要做的是在Linux上面安装该系统下的.NET运行环境Mono。还是因为MSIL的存在,及与CLR的配合,将其解释成本地可执行的代码,过程如下:

  • 复制编译的DLL到linux系统,配置Mono运行时
  • 使用Mono的解释器将复制来的DLL解释为Linux可识别的代码
  • 运行程序
当然,上面说的是理想的情况,就实际情况而言,其它系统的.NET运行环境要么不存在、要么功能有限,另外Windows下的.NET封装了Windows的API,这些功能在其它系统上如何实现也是很头疼的一件事。

执行流程

为了更好的理解跨平台和跨语言,我们来看一下从代码到执行的过程。

流程如下:

  • 将.NET 源代码编译成MSIL
  • CLR即时编译器将MSIL解释为本地代码
  • 执行代码
从图上宏观看,CLS部分解释了跨语言,CLR部分解释了跨平台。

知识拓展

反编译

使用.NET Reflector可以将DLL反编译为源代码,将EXE或DLL反编译所得,可能和真正代码有出入,但是对我们来说,知道思路已经足够,如下:


防编译

目前而言,还没有切实的方法防止反编译,可以将类名和类的成员名称修改为无意义字符串,反编译仍可以理解,但是花费的时间会大幅增加。

反射原理

以下是在验收张薄的收费系统时看到的一段反射代码:

它的大致原理是:

  • 根据DLL的名称加载该DLL
  • 根据类名、元数据和表单(见上),加载类
如果只需要加载类,此处已经完成,但是咱们需要将其转化为符合指定接口的类,所以添加了强制类型转换语句。

这个大家有兴趣可以深究一下,这里只是为大家提供一个宏观的思路。

总结

.NET基础就先说到这里,基本上从宏观上解释了一下.NET,如有错误,欢迎指正。

建议将PPT和本文配合阅读,PPT下载地址:《.NET Framework》

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics