.NET应用程序主要由4种实体组成:
- 类 封装数据和行为的基本单元。
- 模块 构成程序集的IL文件。(Microsoft Intermediate Language (MSIL))
- 程序集 .NET应用程序的主要部署单元口
- 类型模块 间交换数据的通用单元。
1.模块
模块的构成包括Microsoft中间语言(通常简写为IL)代码、相关元数据和程序集清单。默认情况下,Visual Basic编译器创建的程序集只包含一个由程序集代码和清单构成的模块。
IL是表示模块中的托管代码的一种平台无关的方式。执行IL代码前,CLR必须先将其编译为本地机器代码。默认情况下,CLR使用JIT编译器以方法为单位编译IL。在运行过程中,每个方法在第一次被应用程序调用时,由JIT编译器负责将其编译成机器代码。
相关元数据保存了lL中声明的类型的其他信息。模块中包含的元数据由CLR使用。
微软提供了本地镜像生成器或者Ngen.exe。这个工具允许在指定的程序集上运行JIT编译器,把这个程序集以本地代码的形式安装到用户的应用程序缓存中。这么做的好处是用户执行程序集中的功能时,不需要调用JIT编译器,因而节省了时间。注意,JIT编译器只编译程序集中实际被引用的部分,而Ngon.exe编译所有的代码,所以编译所用的时间和用户实际调用时的编译时间并不一样。
2.程序集
程序集是部署.NET应用程序的主要单元,它可以是动态链接库(.dID或可执行文件(.exe)。程序集由一个清单、一个或多个模块以及其他可选文件,如.config、.ASPX、.ASMX、图像等组成。
程序集清单内容
下表显示了在程序集清单中包含的信息。 前四项:程序集名称、版本号、区域性和强名称信息共同构成了程序集的标识。
信息 | 说明 |
---|---|
程序集名称 | 指定程序集名称的文本字符串。 |
版本号 | 主版本号和次版本号,以及修订号和生成号。 公共语言运行时使用这些编号来强制实施版本策略。 |
culture | 有关该程序集支持的区域性或语言的信息。 此信息只应用于将一个程序集指定为包含特定区域性或特定语言信息的附属程序集。 (具有区域性信息的程序集被自动假定为附属程序集。) |
强名称信息 | 如果已经为程序集提供了一个强名称,则为来自发行者的公钥。 |
程序集中所有文件的列表 | 在程序集中包含的每一文件的散列及文件名。 请注意,构成程序集的所有文件所在的目录必须是包含该程序集清单的文件所在的目录。 |
类型引用信息 | 运行时用来将类型引用映射到包含其声明和实现的文件的信息。 该信息用于从程序集导出的类型。 |
有关被引用程序集的信息 | 该程序集静态引用的其他程序集的列表。 如果依赖的程序集具有强名称,则每一引用均包括该依赖程序集的名称、程序集元数据(版本、区域性、操作系统等)和公钥。 |
这个清单可以存储在单独的文件或模块中。但在默认情况下,对于大多数应用程序,该清单是Visual Studio编译的.dll或.exe文件的一部分。 Web应用程序由一组ASPX页面组成,它的程序集信息位于这些ASPX页面引用的DLL中。
3.类型
类型系统提供了用于封装数据与相关行为的模板。在应用程序交互作用时,这个通用模板描述的数据为.NET使用的元数据提供基础口类型分为两种:引用类型和值类型。
COM定义在机器范围上,而类型定义在全局或者程序集的范围内。所有的类型都基于.NET语言共享的公共系统。
类型由字段、属性和方法组成。
每个应用程序都会包含这些元素。有些类型定义在应用程序级别上,而有些定义在全局级别上。在COM模型中,所有组件都是全局注册的。如果想把.NET组件提供给COM,也必须全局注册它。
4.类