学术交流,我们组准备的是《.NET与VB.NET》,我负责的是.NET Framework基础与VB.NET编译原理这两个主题,但是我写着就发现,如果了解.NET Framework,VB.NET编译原理实际上包括在这里面的,所以写着写着就变成了一个主题,本文就从宏观上来给大家介绍一下.NET。
为了从宏观角度看,我画了一个思维导图。
具体来说,我要说的几个方面是:
解释.NET之前,得先来说一下什么是Framework,翻译过来就是“框架、架构、结构、体系”,总而言之它指的是一类事物、问题的宏观指导和解决方案。所以我们可以把.NET Framework理解为.NET这一整套体系的指导和解决方案,这算是一个概念,实例化之,就是你安装的.NET Framework x.x。
我们在学一个知识之前要知道它从何而来,要做何用,我的理解是.NET 推出的原因主要有这几点:
因为本文只是宏观的介绍,所以它所代表的英文缩写大家百度即可。
FCL在.NET中表现为各种各样的类,例如写一个语句:
SqlConnection con = new SqlConnection(conn);实际上使用的就是FCL中的SqlConnection类,因为都是一些“静止”概念的类,我们可以把它理解为.NET的"属性",根据它们之间自上而下的依赖,分为三层:
如上面所说,它是.NET类库的基础部分,大部分包含在FCL中的系统类库中,是最基础的类库,我们以新建一个C#项目为例,新建后打开对象浏览器,看到的mscorlib,就是BCL的一员,它在引用中是无法删除的。
CTS是一套规则、一个协议,是对语言宏观的规范,定义了语言可以做什么,不可以做什么,具有哪些特性。
任何符合这套规则的高级语言就可以称为面向.NET框架的语言(不必全部符合),这意味着.NET拓展性非常好,可以添加其它高级语言。
CLS是CTS的一个子集,它也是一套规则协议,不过和CTS不同的是,它是对语言细节的规范:以.NET平台为目标的语言必须支持的最小特征,例如是否区分大小写、命名规则、标识符、构造函数如何使用……
从上面的组成图可以看到,CTS和CLS位于编程语言和CL之间,这两者的作用就是规范和接口,使不同的编程语言都可以和FCL相通,当然,这就减少了不同语言之间引发的互操作性问题。
微软中间语言,它类似于汇编语言:比机器语言高级,但又不是高级语言。它是代码编译后的中间语言,它没有与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#程序。
添加对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。
跨语言和跨平台的原理是什么?
例如要在Linux下运行Windows下编译的程序,首先需要做的是在Linux上面安装该系统下的.NET运行环境Mono。还是因为MSIL的存在,及与CLR的配合,将其解释成本地可执行的代码,过程如下:
为了更好的理解跨平台和跨语言,我们来看一下从代码到执行的过程。
流程如下:
使用.NET Reflector可以将DLL反编译为源代码,将EXE或DLL反编译所得,可能和真正代码有出入,但是对我们来说,知道思路已经足够,如下:
目前而言,还没有切实的方法防止反编译,可以将类名和类的成员名称修改为无意义字符串,反编译仍可以理解,但是花费的时间会大幅增加。
以下是在验收张薄的收费系统时看到的一段反射代码:
它的大致原理是:
这个大家有兴趣可以深究一下,这里只是为大家提供一个宏观的思路。
.NET基础就先说到这里,基本上从宏观上解释了一下.NET,如有错误,欢迎指正。
建议将PPT和本文配合阅读,PPT下载地址:《.NET Framework》。