"深入理解C#和.NET 2.0:程序集、模块和IL语言"

需积分: 10 13 下载量 39 浏览量 更新于2024-01-22 收藏 2.06MB DOC 举报
#命令行编译器。程序集中的每个模块都由一组CIL(Common Intermediate Language)指令组成。CIL是一种与平台无关的中间语言,它与特定的处理器架构无关。在执行.NET程序时,CLR(Common Language Runtime)将CIL编译成适合特定计算机架构的本机代码。程序集还包括元数据,这些元数据描述了程序集中的类型和成员。此外,程序集还包含程序集清单,其中包含有关程序集本身的信息,如名称、版本号、对其他程序集的引用等。 除了程序集和模块之外,.NET还使用资源文件来存储诸如图像、字符串等非托管资源。资源文件通常是一些已经编译成二进制格式的文件,它们与程序集和模块一样,在应用程序部署时被复制到目标文件夹中。 2.1.2 程序集的部署程序集的部署是指程序集的复制、注册和配置过程。程序集在部署时需要考虑以下几个方面: • 程序集的共享。共享程序集是供多个应用程序使用的组件。其中的一些共享程序集是由操作系统或.NET Framework安装程序安装的,比如System.dll、System.Windows.Forms.dll等。还有一些共享程序集是由第三方组件的安装程序安装的。 • 私有程序集。私有程序集是只供一个应用程序使用的组件。它们通常被复制到应用程序的安装目录下。 • 程序集的查找路径。在运行时,CLR需要查找并加载应用程序所需的程序集。CLR默认会到全局程序集缓存(Global Assembly Cache, GAC)和应用程序的启动目录下寻找程序集。如果找不到,CLR还会根据程序集的清单中指定的URL到网络上查找。 • 程序集的版本。程序集的版本由其名称、公钥标记、文件版本号以及文件哈希值组成。CLR使用这些信息来确定应用程序所使用的程序集的版本。如果要使多个版本的程序集共存,就需要使用CLR提供的配置文件来配置程序集的加载策略。 2.2 共享程序集和私有程序集共享程序集是供多个应用程序使用的程序集。它们需被正确地注册到全局程序集缓存中。全局程序集缓存是一个文件夹,位于%windir%\assembly目录下。它存放了由.NET安装程序安装的共享程序集。全局程序集缓存提供了一种将程序集安装到一个公共位置,并提供程序集的版本控制和共享机制。共享程序集的文件名除了扩展名是.dll外,其余的都是一长串的十六进制数字。这是由程序集的公钥标记确定的。 私有程序集是只供一个应用程序使用的程序集。它们通常被复制到应用程序的安装目录下。当CLR加载一个私有程序集时,CLR会首先到应用程序的启动目录下查找。如果找不到,则会到GAC中查找。 2.3 程序集清单程序集清单是程序集的一个重要组成部分。家庭住址栏中的程序集清单显示了程序集的名称、版本号、包括该程序集的文件的列表以及对其他程序集的引用。程序集清单以XML格式编写。程序集清单的内容是在编译程序集文件时由编译器自动生成并嵌入到程序集中的。CLR在加载程序集时,会读取并分析程序集清单,以了解程序集本身的信息以及程序集与其他程序集之间的依赖关系。 2.4 组件的版本管理组件的版本管理是指组件在开发、安装和使用过程中不同版本之间的关系和互操作。组件的版本要素包括: • 组件的名称。是组件的唯一标识符。 • 组件的版本号。由主版本号、次版本号、生成号以及修订号组成。 • 公钥标记。是该程序集的一部分,用于标识程序集的发布者。 • 文件哈希值。用来确保组件的安全性。 组件的版本管理方式有两种: • 冲突方法。不同版本的组件合并在一个目录下,通过配置文件指定程序集的加载策略。 • 并存方式。不同版本的组件合并在一个目录下,每个组件都有自己的子目录。 2.5 .NET程序集相互引用.NET程序集相互引用是指一个程序集引用了另一个程序集的类型。在.NET程序设计中经常需要引用其他程序集的类型。比如,当在程序中使用.NET Framework类库中的类型时,就需要引用相应的程序集,如System.dll、System.Windows.Forms.dll等。同样地,当在一个程序集中定义的类型被其他程序集所用时,也需要引用该程序集。在C#中,使用using关键字和命名空间来引用其他程序集中的类型。在VB.NET中,使用Imports关键字来达到同样的效果。在IL中,使用.class和.assembly指令来引用其他程序集中的类型。需要说明的是,在对程序集的引用中,CLR会检查程序集的版本、公钥标记等信息以确保程序集的安全性和正确性。