.NET框架基本原理

本文深入探讨了.NET框架的基础原理,包括源代码如何被编译为托管模块,模块如何组合成程序集,以及.NET框架的类库和通用类型系统。介绍了CLR的加载过程和程序集的自描述特性,强调了代码的安全性验证和与非托管代码的互操作性。此外,详细阐述了CTS和CLS规范,展示了.NET如何实现不同语言间的无缝集成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11  将源代码编译为托管模块

 

 

 

.NET框架里,正如前言里说的“编译器编译面向.NET框架的源代码产生CIL,只有到了运行时,CLR才将CIL翻译为CPU指令”。

1、程序员先用任何支持CLR从编程语言来编写代码,然后用相应的语言编译器来做语法检查源代码分析,之后生成的结果就是一个托管模块。托管模块是一个需要CLR才能执行的标准PE(可移植可执行portable executable)文件。大概过程就是这样:

高级语言代码――->托管模块(包含IL和元数据的PE文件)―――>CPU指令(运行时从IL编译产生)

2PE文件是一个非常重要的概念,它由PE表头、CLR表头、元数据IL(中间语言)代码四部分组成。

PE表头:主要时指出了文件的类型,GUICUI或是DLL(不同于以前的Dynamic Link Library,特指程序集文件的一种形式);

CLR表头:包含标识托管模块的一些信息;

元数据(表):该表用于描述代码中用到的类型和成员,描述的类型和成员有两类,一是代码中定义,一是应用的;

IL代码:高级语言编译器编译产生的代码,CLR运行时将它们编译成本地CPU指令

(元数据是一个很重要的概念,书中应该更加明了的说明它的含义,如果是我写这本书,一定会,而且可以举个具体简单的例子说明。)

 

 

 

 

12  将托管模块组合成为程序集

 

 

 

程序集(assembly)是一个抽象的概念,它是一个或多个托管模块,以及一些源文件的逻辑组合。”类似于现在的一个软件可以由几个exe文件、dll文件,还有图标来组成。

程序集中有一个特殊的PE文件,它的作用就是描述程序集中的信息。该PE文件中包含了一个manifest(清单)数据块,这个manifest是一些元数据表的集合,这些元数据表描述组成程序集的文件、程序集所有文件中实现的公有导出类型以及一些和程序集有关的资源文件或数据文件。(CLR运行时应该是先分析这个PE文件中的内容取得程序集的基本信息)。

程序集的这种自描述,使得执行时就不需要到注册表中获取额外的信息。从而使程序集的发布相对现在的非托管组件简单

 

 

 

 

13 加载通用语言运行时(CLR

 

 

 

运行.NET框架程序需要CLR,即机器上应该安装了.NET框架。如果你机器上“%windir/system32”这个目录下有MSCorEE.dll文件就说明安装了.NET框架。

(书中下面解释CLR是怎样加载执行程序,看起来挺糊,书里又说我们没什么需要知道只是为满足某些人的好奇写的。正好顺水推舟跳过去,以后水平高了在来细看)

 

 

 

 

14 执行程序集代码

 

 

 

(这节看起来也挺糊,就整理一些明白点的有用点的东西)

1、高级语言编译成的IL代码,可以用微软提供的ILDasm.exe进行反编译。水平高的可以用ILAsm.exe这个IL汇编器写IL程序。而且,高级语言提供的都只是CLR全部功能的一个子集,IL汇编语言包含CLR全部功能。

(这样对发布给客户的代码的保护很不利,这可能是.NET的一个大瑕疵。作者说可以用第三方提供的代码混淆器,但这样影响到CLR的执行可不是闹这玩的。)

3、作者分析了托管环境里执行时将IL代码编译成CPU指令并不会比非托管代码效率低。

4IL与代码验证:IL代码编译成本地CPU指令时,CLR会执行验证过程,验证IL代码,确保其“安全性”这样保证了应用程序的健壮性。管理员也可以选择关闭验证过程(在Microsot .NET Framework Configuration管理工具中实现)


15 .NET框架类库 (2004-12-14)

FCL(Framework Class Library)含有几千个类型的定义。(它的体系和以前了解的VCL的体系有点类似,不知道其他的类库是否也是以类似的方法来建立?)

1CLRFCL可以开发下面几种应用程序:XML Web服务、Web窗体(Web Forms基于HTML的应用程序)、Windows窗体(GUI应用程序)、Windows控制台应用程序(CUI)、Windows服务和组建库

 

 

 

 

2FCL波阿汉的类型放在一个由namespace(命名空间)组织的集合中提供给开发人员。

System命名空间包含了Object基本类,所有其他的类型都直接或简介由此继承而来;它还包含了整数、字符、字符串、异常处理……。所有的应用程序都会用到System命名空间中的类型。(这里对命名空间的基本概念没做出解释,如果是以前没接触过这一名词的读者肯定会被糊了)

 

 

 

 

3、一些通用的FCL命名空间:

System:其中的类型是为所有应用程序使用的一些基本类型;

System.Collections:其中的类型用于管理对象集合;

System.Diagnostics:其中的类型用于帮助诊断和调试应用程序;

System.Drawing:其中的类型用于操作二维图形;

System.EnterpriseServices:其中的类型用于管理事务、队列组件、对象池……(有点复杂,近阶段我大概用不到,大伙想要了解到MSDN里看看);

 

 

 

System.Globalization:其中的类型用于多国语言支持(近期我用得到吗?估计是用不着,我还没给外国人弄过软件);

System.IO:其中的类型用于操作I/O流、遍历目录和文件;

System.Xml:其中的类型用于处理XML模式(schema)和数据;

……

(还有好多,要详细了解还得花时间去研究,以后做程序的时候就是成天和它们打叫道)。

下面这些命名空间也有必要了解一下:

System.Web.Services:其中的类型用于创建XML Web服务;

System. Web.UI:其中的类型用于创建Web窗体;

System. Windows.Forms:其中的类型用于创建Windows GUI应用程序;

System. ServiceProcess:其中的类型用于创建由SCM控制的Windows服务。

 

 

 

 

 

 

 

 

16 通用类型系统

 

 

 

从前面的内容大家可以看到CLR的所有内容都是围绕类型展开。微软制定的规范CTS(Common Type System,即通用类型系统),就是用来描述类型的定义和行为。

(微软.NET里头的术语都向Common靠,可见其一统天下的野心有多昭然)

1CTS规范规定一个类型可以包含下面的0或多个成员(第三部分有详细介绍):字段、方法、属性和事件

 

 

 

 

2CTS还定义了类型可见性和访问类型成员的一些规则,下载是控制对方法或字段的访问选项:

Private:方法只能被同一类型中的其他方法调用;

Family:方法可以被派生类型的代码调用,不管它们是否在同一个程序集中。(类似于许多语言中的protected;

Family assembly:方法只可以被位于同一个程序集中的派生类型中的代码调用。(C#VB都没有提供这种机制);

Assembly: 方法可以被统一个程序集中的任何代码调用(类似于internal);

Family Assembly方法可以被任何程序集中的派生类型代码调用,也可以被同一程序集中的任何类型调用;(这个和前面的Family区别在哪里?)

Public:方法可以被任何程序集的任何代码调用。

 

 

 

 

 

 

 

另外CTS定义了诸多规则来管理类型继承、虚函数、对象生存期等。我们在编程的时候并不需要了解这些规则,因为在程序被编译成托管代码时会将你所使用的编程语言的语法规则映射为CLR的这些规则(除非你想用IL汇编直接写你选用的语言实现不了的功能)。

CTS不支持多继承,如果你用的C++使用了多继承是不能被编译成托管代码的。

CTS的类型都必须继承自System.Object

 

 

 

 

1.7 通用语言规范

 

 

 

CLR提供语言间对象的操作,即不同语言的代码之间进行无缝的集成(前言里提到过的CRLFCL提供的重要服务之一:无缝的语言集成)。为了解决这个问题微软定义了CLSCommon Language Specification,通用语言规范),不同语言的代码只有符合了这个规范才能彼此集成。它是各种高级语言的一个交集。

书上有一个明了的图说明了CLR/CTS、各种编程语言规范及CLS的关系。大概意思就是:高级语言规范彼此有交集,CLS是它们的共同交集,而这些所有规范都包含在CLR/CTS中(在这章的上半部分有这么一句话:“而且,高级语言提供的都只是CLR全部功能的一个子集,IL汇编语言包含CLR全部功能,”)

 

 

 

 

1.8 与非托管代码互操作

 

 

 

为了使得现存的非.NET代码都可用,微软的设计使得CLR可以在应用程序里同时包含托管和非托管代码。CLR支持三种互操作:

托管代码调用DLL(就是我们说的动态链接库)中的非托管函数

 

 

 

托管代码使用现存的COM组建(非托管组建作为COM服务器)

 

 

 

非托管代码使用托管类型(托管类型作为COM服务器)

 

 

 

 

 

 

 

(第一章整理完成,感觉书写得难度适当,虽然有些地方不完全理解,但对.NET的了解还是很有利的。不知道其他朋友的感觉如何?)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FCL(Framework Class Library)含有几千个类型的定义。(它的体系和以前了解的VCL的体系有点类似,不知道其他的类库是否也是以类似的方法来建立?)

1CLRFCL可以开发下面几种应用程序:XML Web服务、Web窗体(Web Forms基于HTML的应用程序)、Windows窗体(GUI应用程序)、Windows控制台应用程序(CUI)、Windows服务和组建库

 

 

 

 

2FCL波阿汉的类型放在一个由namespace(命名空间)组织的集合中提供给开发人员。

System命名空间包含了Object基本类,所有其他的类型都直接或简介由此继承而来;它还包含了整数、字符、字符串、异常处理……。所有的应用程序都会用到System命名空间中的类型。(这里对命名空间的基本概念没做出解释,如果是以前没接触过这一名词的读者肯定会被糊了)

 

 

 

 

3、一些通用的FCL命名空间:

System:其中的类型是为所有应用程序使用的一些基本类型;

System.Collections:其中的类型用于管理对象集合;

System.Diagnostics:其中的类型用于帮助诊断和调试应用程序;

System.Drawing:其中的类型用于操作二维图形;

System.EnterpriseServices:其中的类型用于管理事务、队列组件、对象池……(有点复杂,近阶段我大概用不到,大伙想要了解到MSDN里看看);

 

 

 

System.Globalization:其中的类型用于多国语言支持(近期我用得到吗?估计是用不着,我还没给外国人弄过软件);

System.IO:其中的类型用于操作I/O流、遍历目录和文件;

System.Xml:其中的类型用于处理XML模式(schema)和数据;

……

(还有好多,要详细了解还得花时间去研究,以后做程序的时候就是成天和它们打叫道)。

下面这些命名空间也有必要了解一下:

System.Web.Services:其中的类型用于创建XML Web服务;

System. Web.UI:其中的类型用于创建Web窗体;

System. Windows.Forms:其中的类型用于创建Windows GUI应用程序;

System. ServiceProcess:其中的类型用于创建由SCM控制的Windows服务。

 

 

 

 

 

 

 

 

16 通用类型系统

 

 

 

从前面的内容大家可以看到CLR的所有内容都是围绕类型展开。微软制定的规范CTS(Common Type System,即通用类型系统),就是用来描述类型的定义和行为。

(微软.NET里头的术语都向Common靠,可见其一统天下的野心有多昭然)

1CTS规范规定一个类型可以包含下面的0或多个成员(第三部分有详细介绍):字段、方法、属性和事件

 

 

 

 

2CTS还定义了类型可见性和访问类型成员的一些规则,下载是控制对方法或字段的访问选项:

Private:方法只能被同一类型中的其他方法调用;

Family:方法可以被派生类型的代码调用,不管它们是否在同一个程序集中。(类似于许多语言中的protected;

Family assembly:方法只可以被位于同一个程序集中的派生类型中的代码调用。(C#VB都没有提供这种机制);

Assembly: 方法可以被统一个程序集中的任何代码调用(类似于internal);

Family Assembly方法可以被任何程序集中的派生类型代码调用,也可以被同一程序集中的任何类型调用;(这个和前面的Family区别在哪里?)

Public:方法可以被任何程序集的任何代码调用。

 

 

 

 

 

 

 

另外CTS定义了诸多规则来管理类型继承、虚函数、对象生存期等。我们在编程的时候并不需要了解这些规则,因为在程序被编译成托管代码时会将你所使用的编程语言的语法规则映射为CLR的这些规则(除非你想用IL汇编直接写你选用的语言实现不了的功能)。

CTS不支持多继承,如果你用的C++使用了多继承是不能被编译成托管代码的。

CTS的类型都必须继承自System.Object

 

 

 

 

1.7 通用语言规范

 

 

 

CLR提供语言间对象的操作,即不同语言的代码之间进行无缝的集成(前言里提到过的CRLFCL提供的重要服务之一:无缝的语言集成)。为了解决这个问题微软定义了CLSCommon Language Specification,通用语言规范),不同语言的代码只有符合了这个规范才能彼此集成。它是各种高级语言的一个交集。

书上有一个明了的图说明了CLR/CTS、各种编程语言规范及CLS的关系。大概意思就是:高级语言规范彼此有交集,CLS是它们的共同交集,而这些所有规范都包含在CLR/CTS中(在这章的上半部分有这么一句话:“而且,高级语言提供的都只是CLR全部功能的一个子集,IL汇编语言包含CLR全部功能,”)

 

 

 

 

1.8 与非托管代码互操作

 

 

 

为了使得现存的非.NET代码都可用,微软的设计使得CLR可以在应用程序里同时包含托管和非托管代码。CLR支持三种互操作:

托管代码调用DLL(就是我们说的动态链接库)中的非托管函数

 

 

 

托管代码使用现存的COM组建(非托管组建作为COM服务器)

 

 

 

非托管代码使用托管类型(托管类型作为COM服务器)

 

 

 

 

 

 

 

(第一章整理完成,感觉书写得难度适当,虽然有些地方不完全理解,但对.NET的了解还是很有利的。不知道其他朋友的感觉如何?)

 

FCL(Framework Class Library)含有几千个类型的定义。(它的体系和以前了解的VCL的体系有点类似,不知道其他的类库是否也是以类似的方法来建立?)

1CLRFCL可以开发下面几种应用程序:XML Web服务、Web窗体(Web Forms基于HTML的应用程序)、Windows窗体(GUI应用程序)、Windows控制台应用程序(CUI)、Windows服务和组建库

 

 

 

 

2FCL波阿汉的类型放在一个由namespace(命名空间)组织的集合中提供给开发人员。

System命名空间包含了Object基本类,所有其他的类型都直接或简介由此继承而来;它还包含了整数、字符、字符串、异常处理……。所有的应用程序都会用到System命名空间中的类型。(这里对命名空间的基本概念没做出解释,如果是以前没接触过这一名词的读者肯定会被糊了)

 

 

 

 

3、一些通用的FCL命名空间:

System:其中的类型是为所有应用程序使用的一些基本类型;

System.Collections:其中的类型用于管理对象集合;

System.Diagnostics:其中的类型用于帮助诊断和调试应用程序;

System.Drawing:其中的类型用于操作二维图形;

System.EnterpriseServices:其中的类型用于管理事务、队列组件、对象池……(有点复杂,近阶段我大概用不到,大伙想要了解到MSDN里看看);

 

 

 

System.Globalization:其中的类型用于多国语言支持(近期我用得到吗?估计是用不着,我还没给外国人弄过软件);

System.IO:其中的类型用于操作I/O流、遍历目录和文件;

System.Xml:其中的类型用于处理XML模式(schema)和数据;

……

(还有好多,要详细了解还得花时间去研究,以后做程序的时候就是成天和它们打叫道)。

下面这些命名空间也有必要了解一下:

System.Web.Services:其中的类型用于创建XML Web服务;

System. Web.UI:其中的类型用于创建Web窗体;

System. Windows.Forms:其中的类型用于创建Windows GUI应用程序;

System. ServiceProcess:其中的类型用于创建由SCM控制的Windows服务。

 

 

 

 

 

 

 

 

16 通用类型系统

 

 

 

从前面的内容大家可以看到CLR的所有内容都是围绕类型展开。微软制定的规范CTS(Common Type System,即通用类型系统),就是用来描述类型的定义和行为。

(微软.NET里头的术语都向Common靠,可见其一统天下的野心有多昭然)

1CTS规范规定一个类型可以包含下面的0或多个成员(第三部分有详细介绍):字段、方法、属性和事件

 

 

 

 

2CTS还定义了类型可见性和访问类型成员的一些规则,下载是控制对方法或字段的访问选项:

Private:方法只能被同一类型中的其他方法调用;

Family:方法可以被派生类型的代码调用,不管它们是否在同一个程序集中。(类似于许多语言中的protected;

Family assembly:方法只可以被位于同一个程序集中的派生类型中的代码调用。(C#VB都没有提供这种机制);

Assembly: 方法可以被统一个程序集中的任何代码调用(类似于internal);

Family Assembly方法可以被任何程序集中的派生类型代码调用,也可以被同一程序集中的任何类型调用;(这个和前面的Family区别在哪里?)

Public:方法可以被任何程序集的任何代码调用。

 

 

 

 

 

 

 

另外CTS定义了诸多规则来管理类型继承、虚函数、对象生存期等。我们在编程的时候并不需要了解这些规则,因为在程序被编译成托管代码时会将你所使用的编程语言的语法规则映射为CLR的这些规则(除非你想用IL汇编直接写你选用的语言实现不了的功能)。

CTS不支持多继承,如果你用的C++使用了多继承是不能被编译成托管代码的。

CTS的类型都必须继承自System.Object

 

 

 

 

1.7 通用语言规范

 

 

 

CLR提供语言间对象的操作,即不同语言的代码之间进行无缝的集成(前言里提到过的CRLFCL提供的重要服务之一:无缝的语言集成)。为了解决这个问题微软定义了CLSCommon Language Specification,通用语言规范),不同语言的代码只有符合了这个规范才能彼此集成。它是各种高级语言的一个交集。

书上有一个明了的图说明了CLR/CTS、各种编程语言规范及CLS的关系。大概意思就是:高级语言规范彼此有交集,CLS是它们的共同交集,而这些所有规范都包含在CLR/CTS中(在这章的上半部分有这么一句话:“而且,高级语言提供的都只是CLR全部功能的一个子集,IL汇编语言包含CLR全部功能,”)

 

 

 

 

1.8 与非托管代码互操作

 

 

 

为了使得现存的非.NET代码都可用,微软的设计使得CLR可以在应用程序里同时包含托管和非托管代码。CLR支持三种互操作:

托管代码调用DLL(就是我们说的动态链接库)中的非托管函数

 

 

 

托管代码使用现存的COM组建(非托管组建作为COM服务器)

 

 

 

非托管代码使用托管类型(托管类型作为COM服务器)

 

 

 

 

 

 

 

 



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值